Gmail приложение, как навигация по фрагментам с NavigationDrawer - PullRequest
0 голосов
/ 06 июня 2018

Я хочу построить навигацию точно так же, как приложение Gmail.Позвольте мне уточнить, что я имею в виду под этим.Приложение Gmail имеет (по крайней мере, судя по всему) 1 активность хостинга, множество фрагментов и блок навигации.

Мне нужно, чтобы панель инструментов работала так же, как в приложении Gmail.

Когдавнутри фрагмента списка (входящие, важные и т. д.) есть эта панель инструментов: вы можете видеть, что навигационная панель переключается там, и она работает как положено.

enter image description here

Когдапереместился к фрагменту одного элемента на этой панели инструментов: Обратите внимание, что кнопка «Назад» ведет себя так же, как и кнопка «Назад» (переход к предыдущему виду).А навигационный ящик все еще можно использовать, проводя со стороны.

enter image description here

Я пытаюсь воспроизвести это поведение следующим образом: я раздуваю меню панели инструментов для каждогофрагмент по отдельности

// both inside list and item fragments
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setHasOptionsMenu(true)
}

// inside list fragment
override fun onCreateOptionsMenu(menu: Menu, menuInflater: MenuInflater) {
    menuInflater.inflate(R.menu.list_toolbar, menu)
    super.onCreateOptionsMenu(menu, menuInflater)
}

// inside item fragment
override fun onCreateOptionsMenu(menu: Menu, menuInflater: MenuInflater) {
    menuInflater.inflate(R.menu.item_toolbar, menu)
    super.onCreateOptionsMenu(menu, menuInflater)
}

Теперь, так как навигационный ящик должен использоваться из всех фрагментов.Это должно быть помещено в представление активности хостинга (я думаю).И вот как я его инициализирую

override fun onCreate(savedInstanceState: Bundle?) {
    // inside hosting activity view
    ActionBarDrawerToggle(this, drawer, toolbar, R.string.open, R.string.close).apply { 
        addDrawerListener(this)
        syncState()
    }
}

Это работает, и я получаю рабочий навигационный ящик.Однако, когда я перехожу к фрагменту элемента.Кнопка «Назад» на панели инструментов работает как кнопка переключения ящика навигации, показывая и скрывая ящик вместо перехода назад.

PS.Вот как я добавляю кнопку «Назад» внутри фрагмента элемента при методе «Создать»

(activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
(activity as AppCompatActivity).supportActionBar?.setDisplayShowHomeEnabled(true)

Таким образом, реальный вопрос заключается в том, как заставить кнопку «Назад» вести себя так, как следует, вместо переключения ящика навигации?

1 Ответ

0 голосов
/ 06 июня 2018

создать деятельность, называемую homeActivity, как (пример)

добавить это в свой xml, которое будет вашей домашней активностью xml

FrameLayout asКонтейнер помогает в транзакции Fragment ... и устанавливает верхнюю границу Framelayout как 50dp, чтобы панель инструментов оставалась там, когда вы начинаете транзакцию

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>


<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="53dp"
    android:layout_alignParentTop="true"
    android:id="@+id/too"
    >
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentTop="true"
        >
        <android.support.v7.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:id="@+id/tabs"
            android:background="@drawable/new_layout"
            >
            <ImageView(icon)
                android:id="@+id/animation_view"
                android:layout_marginTop="5dp"
                android:layout_width="40dp"
                android:layout_height="40dp"
                />

        </android.support.v7.widget.Toolbar>

 </android.support.design.widget.AppBarLayout>
</RelativeLayout>
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop = "50dp"
    android:id="@+id/container">
  </FrameLayout>

 </android.support.design.widget.CoordinatorLayout>

используйте это в домашней деятельностидля транзакции

private void initializeFragment(){

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();

    fragmentTransaction.add(R.id.main_container, homeFragment);
    fragmentTransaction.add(R.id.main_container, notificationFragment);
    fragmentTransaction.add(R.id.main_container, accountFragment);

    fragmentTransaction.hide(notificationFragment);
    fragmentTransaction.hide(accountFragment);

    fragmentTransaction.commit();

}

private void replaceFragment(Fragment fragment, Fragment currentFragment){

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    if(fragment == homeFragment){

        fragmentTransaction.hide(accountFragment);
        fragmentTransaction.hide(notificationFragment);

    }

    if(fragment == accountFragment){

        fragmentTransaction.hide(homeFragment);
        fragmentTransaction.hide(notificationFragment);

    }

    if(fragment == notificationFragment){

        fragmentTransaction.hide(homeFragment);
        fragmentTransaction.hide(accountFragment);

    }
    fragmentTransaction.show(fragment);

    //fragmentTransaction.replace(R.id.main_container, fragment);
    fragmentTransaction.commit();

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