0

一見するとこれが重複しているように見える他の質問があることは知っていますが、私の場合、これらの回答はどれも機能しません。

私が望むのは、戻るボタンがどのように機能するかに関してメインアクティビティのように表示される最初のフラグメントです。戻るボタンが押されたときに最初のフラグメントに戻るには、ナビゲーションドロワーから選択したフラグメントが必要です。もう一度押してアプリを終了します。

そのため、addToBackStack を使用してみましたが、別のフラグメントに移動すると、戻るボタンを押すと最初のフラグメントに戻ります (希望どおり) が、もう一度戻るボタンを押すと白い画面が表示されます (これが原因かどうか疑問に思います)以下に含まれるトランザクション アニメーションの im を使用するので、これを回避するために、[戻る] ボタンをオーバーライドして、finish(); への呼び出しをスローしようとしました。しかし、これにより、最初のフラグメントに戻るのではなく、どのフラグメントが終了しても、上記のリンクや他の多くの回避策をいくつか試しましたが、適切な修正が見つかりませんか?

これが私のメインアクティビティdisplayViewです

 private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;

    switch (position) {
        case 0:
            fragment = new FirstFragment();

            break;

        case 1:
            fragment = new glideFrag();
            break;
        case 2:
            fragment = new secondGlideFrag();
            break;
        case 3:
            fragment = new thirdGlideFrag();
            break;
        case 4:
            fragment = new forthGlideFrag();
            break;

        case 5:
            fragment = new lgFrag();
            break;
        case 6:
            fragment = new cyanFrag();
            break;
        case 7:
            fragment = new sonyFrag();
            break;
        case 8:
            fragment = new SecondFragment();
            break;

        default:
            break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.enter,R.anim.exit,R.anim.pop_enter,R.anim.pop_exit);

        //fragmentManager.beginTransaction()
                fragmentTransaction.replace(R.id.frame_container, fragment).addToBackStack("first Fragment").commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }

私はそれを回避する素晴らしい方法のように見えるこれを見つけました

private boolean popNext = false;

  if(popNext){
        if(position == INITIAL_POSITION){
            onBackPressed();
            mDrawerLayout.closeDrawer(mDrawerList);
            popNext = false;
            return;
        }
        getSupportFragmentManager().popBackStackImmediate();
    }
    else{
        if(position == INITIAL_POSITION){
            mDrawerLayout.closeDrawer(mDrawerList);
            return;
        }
        popNext=true;
    }

しかし、私はまだAndroidにかなり慣れていないので、INITIAL_POSITIONを何に設定すればよいかわからないので、試しました

private static final INITIAL_POSITION = 0; 

しかし、運がなければ

4

3 に答える 3

0

BladeCoders の回答は、私の質問に答えるのではなく、バックスタックがどのように機能するかを教えようとするものでした。ハックしますが、完全に機能します

@Override
public void onBackPressed() {
    FragmentManager fragmentManager = getSupportFragmentManager();

if (fragmentManager.getBackStackEntryCount() < 1){
        Fragment fragment = new FirstFragment();
        FragmentTransaction fragmentTransaction =    
        getSupportFragmentManager().beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.enter, R.anim.exit, 
        R.anim.pop_enter, R.anim.pop_exit);

        getSupportActionBar().setTitle(mDrawerTitle);

        fragmentTransaction.replace(R.id.frame_container, 
        fragment).addToBackStack("first").commit();

    }else{
        finish();
    }
}
于 2015-07-29T10:13:13.317 に答える
-2

バックスタックがなくても、誰かを助けることができるように単純化するという私の視点だけでそれを行うことができます。

 @Override
public void onBackPressed(){

    Fragment f = getSupportFragmentManager().findFragmentById(R.id.container_body);
    if(f.getClass().getName().equals(HomeFragment.class.getName())){ // here HomeFragment.class.getName() means from which faragment you actually want to exit
        finish();
    }else{
        displayView(0);  //were you want to go when back button is pressed
    }

}





private void displayView(int position) {
    Fragment fragment = null;
    String title = getString(R.string.app_name);
    switch (position) {
        case 0:
            fragment = new HomeFragment();
            title = getString(R.string.app_name);
            break;
        case 1:
            fragment = new OffersFragment();
            title = getString(R.string.nav_item_offers);
            break;
        case 2:
            fragment = new NotificationFragment();
            title = getString(R.string.nav_item_notifications);
            break;

        default:
            break;
    }

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

        // set the toolbar title
        getSupportActionBar().setTitle(title);
    }
}
于 2015-12-12T07:51:39.980 に答える