Ограничить элементы макета фрагментами в верхней части нижней панели навигации? - PullRequest
0 голосов
/ 20 сентября 2018

это мой первый вопрос, опубликованный здесь, поэтому, если я что-то пропущу, дайте мне возможность обновить мой вопрос!

Итак, я (относительно) опытный разработчик быстрых приложений с несколькими приложениями в App Store.

В настоящее время я работаю над переносом этих приложений в магазин Google Play, и мне довольно трудно добиться, чтобы что-то происходило почти так же гладко, как в Swift.Я решил перезапустить весь свой первый проект из пустого приложения и задавать вопросы по пути, чтобы просто создать его.

Мое приложение использует одно основное действие для управления 4-5 фрагментами, управляемыми bottomBar.элемент навигации.Я хочу ограничить пространство просмотра фрагментов так, чтобы оно было:

frag_view_top = titlebar_bottom

фрагмент_view_bottom = bottomBar_navigation_top

таким образом, ничто никогда не будет скрыто за верхом и низом.

Я пробовал несколько различных вариантов ограничения макета, и ничего не работает правильно.Даже до того, как добавить пустой фрагмент нижней панели навигации внутри фрагмента, чтобы я мог ограничиться этим, и это все равно не сработало!

Любая помощь будет принята с благодарностью, спасибо!

фрагмент.xml код:

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/fragment_home">

    <android.support.v7.widget.AppCompatImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/newsImage"
        app:layout_constraintBottom_toTopOf="@id/navigation"/>

</android.support.constraint.ConstraintLayout>

и вот мой код main_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent"
    android:id="@+id/container">

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="0dp"
        android:layout_marginStart="0dp"
        android:layout_gravity="bottom"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/navigation" />

</FrameLayout>

РЕДАКТИРОВАТЬ 09.20.2018:

этокак я реализую переключение между своими фрагментами в своей основной деятельности

MainActivity.kt code:

    class HomeActivity : AppCompatActivity(){

    lateinit var toolbar: ActionBar

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_home -> {
                toolbar.title = "Home"
                val homeFragment = HomeFragment.newInstance()
                openFragment(homeFragment)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_map -> {
                toolbar.title = "Map"
                val localFragment = LocalFragment.newInstance()
                openFragment(localFragment)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)

        toolbar = supportActionBar!!
        val bottomNavigation: BottomNavigationView = findViewById(R.id.navigation)
        bottomNavigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
        bottomNavigation.selectedItemId = R.id.navigation_home



    private fun openFragment(fragment: Fragment) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.container, fragment)
        transaction.addToBackStack(null)
        transaction.commit()
    }
}

1 Ответ

0 голосов
/ 20 сентября 2018

Проблема: Вы заменяете фрагмент контейнером.положить FrameLayout в main_activity.xml и заменить фрагмент из этого.Как,

 <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent">

        <FrameLayout
            android:id="@+id/frmFragment"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toTopOf="@id/navigation"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"/>

        <android.support.design.widget.BottomNavigationView
            android:id="@+id/navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginEnd="0dp"
            android:layout_marginStart="0dp"
            android:layout_gravity="bottom"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"/>
    </android.support.constraint.ConstraintLayout>

, а затем изменить свой код openFragment Как

  private fun openFragment(fragment: Fragment) {
    val transaction = supportFragmentManager.beginTransaction()
    transaction.replace(R.id.frmFragment, fragment)
    transaction.addToBackStack(null)
    transaction.commit()
  }
...