0

Android Design Support Library でナビゲーション メニューを表示するために、新しい NavigationView を使用しています。また、 FrameLayout を DrawerLayout に使用して、フラグメントをそれに置き換えています。

フラグメント間で変更すると問題が発生します。つまり、NavigationView を使用して別の Fragment をクリックし、最初の Fragment に戻ると、そのビューは単に「消去」されています (ViewPagers タブのコンテンツが消えるだけです)。FrameLayout を「更新」する方法がわかりません。また、 transaction.replace()を使用する代わりに Fragments を再利用する必要があるかどうかもわかりません。

<android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="?attr/actionBarSize" />
        <include layout="@layout/toolbar" />
    </RelativeLayout>
    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/menu_drawer" />
</android.support.v4.widget.DrawerLayout>

また、このメソッドを使用して、フラグメントを FrameLayout に切り替えます。

private void displayFragment(int position) {
    Fragment fragment = null;
    String title = "";

    switch (position) {
        case 0:
            fragment = new FragmentA();
            title = getString(R.string.fragment_a);
            break;
        case 1:
            fragment = new FragmentB();
            title = getString(R.string.fragment_b);
            break;
        case 2:
            fragment = new FragmentC();
            title = getString(R.string.fragment_c);
            break;

        default:
            fragment = new HomeFragment();
            title = getString(R.string.app_name);
            break;
    }

    if (fragment != null) {
        fragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.content_frame, fragment);
        transaction.commit();

        drawerLayout.closeDrawers();
        setTitle(title);
    } else {
        Log.w(TAG, "Error creating fragment");
    }
}

ありがとう!!

4

5 に答える 5

0

フラグメントを置き換えるときに、これを試してみる必要があるかもしれません..

transaction.replace(R.id.content_frame, fragment).addToBackStack("Any_String");
于 2015-06-13T05:12:59.470 に答える
0

これを試して

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
            if (navigationView != null) {
                setupDrawerContent(navigationView);
            }


     private void setupDrawerContent(NavigationView navigationView) {
            navigationView.setNavigationItemSelectedListener(
                    new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    Fragment fragment = null;
                    switch (menuItem.getItemId()) {
                        case R.id.nav_home:
                            Log.i("TAG","HOME");
                            fragment = new CheeseListFragment();
                            break;
                        case R.id.nav_messages:
                            fragment = new MessageFragment();
                            break;
                        case R.id.nav_friends:
                            fragment = new FriendsFragment();
                            break;
                        case R.id.nav_discussion:
                             fragment = new DiscussionFragment();
                            break;

                    }

                    if (fragment != null) {
                        FragmentManager fragmentManager = getSupportFragmentManager();
                        fragmentManager.beginTransaction()
                                .replace(R.id.container, fragment).commit();

                    }
                        menuItem.setChecked(true);
                        mDrawerLayout.closeDrawers();
                        return true;

                }
            });
}

この方法でフラグメントを開くことができますスイッチケースでどのメニューが選択されているかを確認し、それに応じてフラグメントを開きます

于 2015-07-31T11:28:22.040 に答える
0

この回答に基づいて、解決策は、ViewPagers Tabs などの他のフラグメントを含むフラグメント内getChildFragmentManager()の代わりに使用することでした。getSupportFragmentManager()

于 2016-02-22T12:19:40.337 に答える
0

このソリューションは、私と同じように機能するはずです。アクティビティで次の変更を行います...そして、アクティビティのonbackpressedボタンをオーバーライドすることを忘れないでください...フラグメントマネージャーにフラグメントをロードし、ボタンがあればそれを返します...それ以外の場合は、ユーザーからホーム画面へ (カスタマイズできるため)

fragmentManager = getSupportFragmentManager();
    ChatWithUs myFragment0 = new ChatWithUs();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.replace(R.id.frameholder, myFragment0);
    ft.addToBackStack("chat_fragment");
    ft.commit();
    Log.i(MainActivity.TAG, "this is create method last line");

@Override
public void onBackPressed() {
    fragmentManager = getSupportFragmentManager();
    int backCount = fragmentManager.getBackStackEntryCount();
    //Log.i(MainActivity.TAG, String.valueOf(backCount));
    if((backCount > 1)){
        //Log.i(MainActivity.TAG, String.valueOf(backCount)) ;
        //Log.i(MainActivity.TAG, "im here") ;
        fragmentManager.popBackStack();
        Log.i(MainActivity.TAG, String.valueOf(fragmentManager.getBackStackEntryCount()));
    }
    else{
        //super.onBackPressed();
        //Log.i(MainActivity.TAG, String.valueOf(fragmentManager.getBackStackEntryCount())) ;
        Intent a = new Intent(Intent.ACTION_MAIN);
        a.addCategory(Intent.CATEGORY_HOME);
        a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(a);
    }

}`
于 2016-01-11T07:44:47.803 に答える