Как вставить макет фрагмента в макет кадра - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь создать приложение для Android с использованием Kotlin в первый раз и пытаюсь использовать различные макеты фрагментов, когда пользователь нажимает на значки навигации, не перекрывая мою нижнюю панель навигации.Я создал FrameLayout с целью поместить в него макеты фрагментов, но неясно, как написать код для этого.

Это MainActivity.kt, который у меня есть, который охватывает панель навигации.сейчас:

private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
       when (item.itemId) {
            R.id.navigation_home -> {
                setContentView(R.layout.fragment_home)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_favorites -> {
                setContentView(R.layout.fragment_favorite)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_calculator -> {
                setContentView(R.layout.fragment_calculator)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

А это мой макет кадра:

<FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above= "@id/nav_view">

</FrameLayout>

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Пожалуйста, обратитесь к очень хорошему источнику знаний: https://developer.android.com/training/basics/fragments/fragment-ui#AddAtRuntime

В основном вам необходимо создать транзакцию, которая упоминается в ссылке:

val transaction = supportFragmentManager.beginTransaction().apply {
  // Replace whatever is in the fragment_container view with this fragment,
  // and add the transaction to the back stack so the user can navigate back
  replace(R.id.fragment_container, newFragment)
  addToBackStack(null)
transaction.commit()
}

, поэтому в вашем случае:

when (item.itemId) {
var fragment: Fragment
            R.id.navigation_home -> {
              fragment = HomeFragment()
            }
            .
            .  
            .
val transaction = supportFragmentManager.beginTransaction().apply {
  replace(R.id.fragment_container, fragment)
  addToBackStack(null)
  transaction.commit()

Вы также можете использовать add вместо replace.

Пожалуйста, обратитесь к этому сообщению, чтобы определить, какой метод использовать: Разница между add (), replace (),и addToBackStack ()

0 голосов
/ 20 мая 2019

Вы хотите перейти к соответствующему фрагменту, когда выбрана вкладка на панели навигации. Вот как ты это делаешь.

Допустим, у нас есть MainActivity, которая имеет 3 вкладки: «Tab1», «Tab2», «Tab3». MainActivity будет иметь 2 XML-макета: navBar и FrameLayout. Затем вы захотите создать 3 новых фрагмента (каждый из которых имеет свою собственную разметку XML). Эти 3 фрагмента будут отображать структуру кадра, когда выбрана соответствующая вкладка панели навигации

Например:

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ XML

<FrameLayout
    android:id="@+id/mainFragment"
    android:layout_width="match_parent"
    android:background="#ffffff"
    android:layout_height="match_parent"
    android:layout_above="@+id/bottom_nav"
    android:text="@string/title_home" />

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_nav"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="?android:attr/windowBackground"
    app:menu="@menu/bottom_navigation" />

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ КОТЛИН

class MainActivity : AppCompatActivity() {

private lateinit var manager: FragmentManager
private lateinit var transaction: FragmentTransaction

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.navigation_tab1 -> {

            title = "Tab1"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab1Fragment())
            transaction.addToBackStack(null)
            transaction.commit()


            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_tab2 -> {

            title = "Tab2"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab2Fragment())
            transaction.addToBackStack(null)
            transaction.commit()

            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_tab3 -> {

            title = "Tab 3"
            manager = supportFragmentManager
            transaction = manager.beginTransaction()
            transaction.replace(R.id.mainFragment, Tab3Fragment())
            transaction.addToBackStack(null)
            transaction.commit()

            return@OnNavigationItemSelectedListener true
        }
    }
    false
}

@SuppressLint("CommitTransaction")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val navigation = findViewById<View>(R.id.bottom_nav) as BottomNavigationView
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...