Android как вызвать Navigation Drawer из фрагмента - PullRequest
0 голосов
/ 21 сентября 2019

В моем фрагменте у меня есть панель поиска материала с навигационной кнопкой (хамбагер).Как я могу вызвать Navigation Drawer, который находится в основном действии с этой кнопкой хамбугера в моем фрагменте Не понимаю, как с ней обращаться в DictionaryFragment

MainActivity:

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    LinearLayout content = (LinearLayout) findViewById(R.id.content);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,
            drawer,
            R.string.nav_open_drawer,
            R.string.nav_close_drawer){

    };
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

DictionaryFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

materialSearchBar = (MaterialSearchBar) RootView.findViewById(R.id.search_bar);

...

materialSearchBar.setOnSearchActionListener(new MaterialSearchBar.OnSearchActionListener() {

        @Override
        public void onButtonClicked(int buttonCode) {
             //***HOW TO HANDLE IT HERE?***
            //switch (buttonCode) {
              //  case MaterialSearchBar.BUTTON_NAVIGATION:
              //      drawer.openDrawer(Gravity.START);
              //      break;}
        }
    });
       //return RootView;
}

макет

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/searchBarDividerColor"
tools:context="com.hfad.catchat.DictionaryFragment">

<com.mancj.materialsearchbar.MaterialSearchBar
    android:id="@+id/search_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dp"
    app:mt_hint="Search"
    app:mt_navIconEnabled="true"
    app:mt_speechMode="false" />

    <android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_search"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="android.support.v7.widget.LinearLayoutManager"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" >

</android.support.v7.widget.RecyclerView>
</LinearLayout>

1 Ответ

1 голос
/ 21 сентября 2019

Это то, что вы можете попробовать, где вы хотите переключить блок навигации в вашем фрагменте, таким образом, вам нужно будет написать метод в действии, чтобы делать то, что вы хотите сделать из вашего фрагмента, убедитесь, что это публичный метод:

    ((MainActivity)getContext()).toggleDrawer();

в вашей MainActivity:

    public void toggleDrawer(){
    //do your stuff
    }

Другой способ - это обратный вызов или интерфейс (предпочтительный), передать его в качестве параметра в конструктор фрагмента и использовать его там, где вы хотите изменитьсостояние ящика.Как внутри вашей деятельности:

    Callback callback = new Callback(){
    @Override
    public void onDrawerStateChanged(){
      //do your stuff
    }};
    new DictionaryFragment(callback);

А внутри вашего фрагмента вам нужно написать конструктор, чтобы принять этот обратный вызов и сохранить в локальной переменной:

    public DictionaryFragment() {
    }


    @SuppressLint("ValidFragment")
    public DictionaryFragment(Callback callback) {
    this.callback = callback;
    }

И использовать его следующим образом:

    callback.onDrawerStateChanged();

Вы также можете передавать параметры в MainActivity в обоих направлениях.

...