2017-10-09 6 views
0

私はいくつかのフラグメントを呼び出す単一のアクティビティとして実装したいほんの少数のスクリーンで、小さなアプリケーションに取り組んでいます。私はAndroid用のJavaでいくつかの経験がありますが、Kotlinは新しい領域です。 私は基本的にKotlinにフラグメントを追加する方法を理解しましたが、私は再利用可能な方法でそれをやりたいと思います。 私はhereという解決策を見つけました。それはうまく動作しますが、私はそれほど理解していないことがあります。私の次MainActivityは、これまで動作しますが、私はそれをここで行ったようのonCreateメソッドにするvar welcomeFragmentを作成する必要があります。合理化されたKotlinのフラグメントの追加と置き換え

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { 

    override fun onCreate(savedInstanceState: Bundle?) { 

     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 
     setSupportActionBar(toolbar) 

     val toggle = ActionBarDrawerToggle(
       this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) 
     drawer_layout.addDrawerListener(toggle) 
     toggle.syncState() 

     nav_view.setNavigationItemSelectedListener(this) 

     var welcomeFragment = Fragment.instantiate([email protected], 
       WelcomeFragment::class.java!!.getName()) 

     addFragment(welcomeFragment, welcome) 

    } 

    inline fun android.support.v4.app.FragmentManager.inTransaction(func:    android.support.v4.app.FragmentTransaction.() -> android.support.v4.app.FragmentTransaction) { 
    beginTransaction().func().commit() 
    } 


    fun AppCompatActivity.addFragment(fragment: Fragment, frameId: Int){ 
     supportFragmentManager.inTransaction { add(frameId, fragment) } 
    } 

    fun AppCompatActivity.replaceFragment(fragment: Fragment, frameId: Int) { 
     supportFragmentManager.inTransaction{replace(frameId, fragment)} 
    } 




    } 

私はプロパティを宣言し、後で割り当てることができない理由を得るように見えることはありませんそれ。それはlateinitでそれを宣言することは可能だが、私は、このようにそれを割り当てるしようとすると:

var welcomeFragment = Fragment.instantiate([email protected], 
       WelcomeFragment::class.java!!.getName()) 

私が手「型の不一致 - 必須:!フラグメント、見つかった:WelcomeFragmentを」また 、私はこれをしようとします

addFragment(WelcomeFragment, welcome) 

のAndroid Studioはコンパニオンオブジェクトを持っていない(「ようこそ」と言って、今のTextViewを除き、単に空である)「WelcomeFragmentについて不平を言います。私は1つを作ることを試みたが、私はそれが何をしなければならないのか本当に理解していない。ドキュメンテーションを読んでも、私はこの問題を解決できませんでした。

私の質問は:どのようにインスタンス化の権利を行うか、または私の断片の大部分が1つのインスタンスだけである場合は、すべてそれを行う必要がありますか?フラグメントにコンパニオンオブジェクトを正しく追加することでこれを回避できますか?どのように見えるだろうか?

私はここにある誤解や、愚かなことを指摘してくれました。

+0

私は今コトリンに慣れていましたが、私はこの質問をしたときにこれらのことを正しく行う方法を知りませんでした。だから私はそれが有用な質問ではないと思う。 – michpohl

答えて

1

輸入品に注意してください。android.support.v4.app.Fragment と表示されることがあります。その場合、android.app.Fragment.instantiateの機能は使用できません。

+0

正確にはどういう意味ですか?私はそれらを混在させることができますか?私のインポートはすべてandroid.support.v4.app.Fragmentクラスです。 – michpohl

+0

"タイプの不一致 - 必須:フラグメント、found:WelcomeFragment!" Fragment.instantiateにアクセスして別のクラスを渡そうとするときの典型的なエラーです。私はちょうどそれを言う。私はあなたのエラーを再現しようとします –

関連する問題