web-dev-qa-db-ja.com

ナビゲーションドロワー、戻るボタンを操作して前のフラグメントに移動しますか?

組み込みのナビゲーションドロワーを使用してアプリを実行しています。戻るボタンの処理方法がわかりません。押されたら、最初のフラグメントを再度ロードする必要があります。フラグメント1。

そのため、アプリを起動すると、Fragment1が起動します。その後、フラグメント2-5をクリックして、他のページに移動できます。これらすべてのページ内で、戻るボタンを使用してユーザーをFragment1に戻します。ユーザーが戻るボタンからアプリを終了できる唯一の場所はFragment1です。

それがすべてFragmentActivityによって処理されるので、そこでバックボタンをいじってみました。ただし、強制終了エラーが発生し続けます。

(01-11 14:09:33.114: E/AndroidRuntime(8292): Android.view.InflateException: Binary XML file line #7: Error inflating class fragment)

これは私がこれまでに持っているものです:

このようにフラグメントをバックスタックに追加するようにしました。

fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();

戻るボタン:

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().findFragmentByTag("fragBack") != null) {

    }
    else {
        super.onBackPressed();
        return;
    }
    if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
        Toast.makeText(getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
        Fragment frag = getSupportFragmentManager().findFragmentByTag("fragBack");
        FragmentTransaction transac = getSupportFragmentManager().beginTransaction().remove(frag);
                transac.commit();
    }

}

誰も私が何をする必要があるか知っていますか?引き出しを制御するFragmentActivityではなく、すべてのフラグメントでonBackPressedを呼び出す必要がありますか(可能な場合)。過去のアプリでは、ユーザーがどのFragmentを使用しているかに関係なく、戻るボタンでアプリを閉じることができましたが、今作成しているものでは、戻るボタンをFragment1に戻します。

本当に助けてくれてありがとう、ありがとう。

onItemClick

@Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            Fragment newFragment = new MapsPage();
            FragmentManager fm = getSupportFragmentManager();
            switch(i) {
            case 0:
                newFragment = new Fragment2();
                break;
            case 1:
                newFragment = new Fragment3();
                break;
            case 2:
                newFragment = new Fragment4();
                break;
            case 3:
                newFragment = new Fragment5();
                break;
            }
            fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragback").commit();
            drawerLayout.closeDrawer(rl);
        }
33
RED_

の代わりに:

fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();

コール:

fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();

addToBackStackはaddで機能します。

replace関数は前のフラグメントを削除して新しいフラグメントを配置するため、バックスタックには常に1つのフラグメントしかありません。したがって、add関数を使用して、以前のフラグメントをスタックに保持します。

BackPressのフラグメントから常にfragemnt1に移動するには、次を実行してください。

getFragmentManager().popBackStack();
fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();

これにより、バックスタックから最後のトランザクションが削除され、新しいトランザクションが追加されます。これを試して。

36
vipul mittal

この質問は、受け入れられた答えと同じ問題を抱えている可能性のある他の人にとっては少し古いものですが、私の調査結果を報告したかっただけです。私にとっては、受け入れられた答えで提案された方法を実行することで、レイヤーをオーバーラップさせ、すぐに判読不能にしました。以下のコード(受け入れられた回答から適応)は、オーバーレイを回避しますが、画面をバックスタックに追加します。

fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack("fragBack").commit();

これが誰かを助けることを願っています!

6
Kyle

場合によっては、replaceを使用する必要があるため、addtobackstack()を使用できないため、mainActivityでこのコードを使用できます。このコードでは、バックキーを押すと、常に最初のフラグメントに移動します(私はそれをHomeFragmentと呼びます)。ホームフラグメントにいるときは、アプリケーションから出るために2回時間を尋ねます(私の貧しい英語のために

 private Boolean exit = false;
@Override
    public void onBackPressed() {
        if (exit) {
            super.onBackPressed();
            return;
        }

    try {
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag("HOME");
        if (fragment != null) {
            if (fragment.isVisible()) {
                this.exit = true;
                Toast.makeText(this, "Press Back again to Exit", Toast.LENGTH_SHORT).show();
            }
        }
        else {
            fragment = HomeFragment.class.newInstance();
            getFragmentManager().popBackStack();
            fragmentManager.beginTransaction().replace(R.id.flContent, fragment, "HOME").commit();
        }
    } catch (Exception e) {

    }
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            exit = false;
        }
    }, 2000);
}
3
Muzhan
 - @Override
       public void onBackPressed() {
           DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
           int backstack = getSupportFragmentManager().getBackStackEntryCount();
           if (drawer.isDrawerOpen(GravityCompat.START)) {
               drawer.closeDrawer(GravityCompat.START);
           } else if (backstack > 0) {
              for (int i = 0; i < backstack; i++) {
                   getSupportFragmentManager().popBackStackImmediate();
            }
       } else {
           this.finish();
        }
    }
1
Neeraj Gupta