1

フラグメントとフラグメントのバック処理について読み続けていますが、ここで最適な解決策を見つけることができませんでした。

ナビゲーションドロワーがあります。

item1 をクリックすると、ナビゲーション ドロワー リスト (item1、item2) に 2 つのアイテムがあり、A Fragment が開いているとします。in A Fragment ボタンをクリックすると、B Fragment が開きます。したがって、B フラグメントが開かれ、ナビゲーション ドロワーから item2 を選択すると、C フラグメントが開きます。

そして、戻るボタンを押すと、Bフラグメントに移動せずにアクティビティを終了する必要があります。

つまり、item1を選択するとitem2がAフラグメントまたはCフラグメントを開き、戻るボタンを押した後にアクティビティを終了する必要がありますが、Bフラグメント(item1の下にあります)を開くとAフラグメントに戻る必要があります

私にはとても難しいので助けてください。ありがとう

public class MainActivity extends DefaultActivity {
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggleWrapper mDrawerToggle;
    private ListView mDrawerListView;
    private TextView mTitle;
    private Runnable mPendingRunnable;
    private Handler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mDrawerListView = (ListView) findViewById(R.id.left_drawer);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mFragmentManager = getSupportFragmentManager();
        mHandler = new Handler();

        LayoutInflater inflator = (LayoutInflater) this .getSystemService(LAYOUT_INFLATER_SERVICE);
        View v = inflator.inflate(R.layout.custom_view, null);
        mTitle = (TextView)v.findViewById(R.id.title);

        getSupportActionBar().setBackgroundDrawable(null);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        getSupportActionBar().setDisplayShowCustomEnabled(true);
        getSupportActionBar().setDisplayUseLogoEnabled(false);
        getSupportActionBar().setDisplayShowHomeEnabled(false);
        getSupportActionBar().setIcon(R.drawable.button_indicator_menu);
        getSupportActionBar().setCustomView(v);

        v.findViewById(R.id.menu).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!mDrawerLayout.isDrawerOpen(GravityCompat.START)){
                    mDrawerLayout.openDrawer(GravityCompat.START);
                }else {
                    mDrawerLayout.closeDrawers();
                }
            }
        });

        mDrawerToggle = new ActionBarDrawerToggleWrapper(this, mDrawerLayout, R.drawable.transparent_gic, R.string.drawer_open, R.string.drawer_close){
            public void onDrawerClosed(View view) {
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                if (mPendingRunnable != null) {
                    mHandler.post(mPendingRunnable);
                    mPendingRunnable = null;
                }
            }

            public void onDrawerOpened(View drawerView) {
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };
        mDrawerToggle.addPartnerToggle(new ContentDisplaceDrawerToggle(this, mDrawerLayout, R.id.content_frame));
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        setLeftDrawerLeftMenu();

        getFragment(getString(R.string.home));
        setTitle(getString(R.string.home));
    }

    private void setLeftDrawerLeftMenu(){
        final ArrayList<Item> items = new ArrayList<Item>();
        items.add(new SectionItem(this,"icons_small_home",getString(R.string.home)));

        items.add(new SectionItem(this,"icons_small_myacounts",getString(R.string.my_account)));
        items.add(new EntryItem(getString(R.string.bonuses)));
        items.add(new EntryItem(getString(R.string.account_recharge)));
        items.add(new EntryItem(getString(R.string.tariff_plans)));
        items.add(new EntryItem(getString(R.string.languages)));


        EntryAdapter adapter = new EntryAdapter(MainActivity.this, items);

        mDrawerListView.setAdapter(adapter);

        mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                EntryItem item = (EntryItem) items.get(i);
                    setTitle(item.getTitle());
            }
        });
    }


    public void setTitle(final String title){
        mTitle.setText(title);
        mPendingRunnable = new Runnable() {
            @Override
            public void run() {
                getFragment(title);
            }
        };

        mDrawerLayout.closeDrawers();
    }

    public void getFragment(String name){
        if(getString(R.string.orange_shops).equalsIgnoreCase(name)){
            if (!(mSelectedFragment instanceof OrangeShopsFragment)){
                addPage(new MyFragment(MainActivity.this),true);
            }
        }else if(getString(R.string.home).equals(name)){
            addPage(new HomeFragment(MainActivity.this),false);
        }else{
            throw new RuntimeException("unknown fragment "+ name);
        }
    }

 public void addPage(final DefaultFragment pDefaultFragment, final boolean isAddToBackStack){
        FragmentTransaction transaction = mFragmentManager.beginTransaction();
        transaction.replace(R.id.content_frame, pDefaultFragment);
        if (isAddToBackStack) transaction.addToBackStack(null);
        transaction.commitAllowingStateLoss();
    }
}
4

2 に答える 2

1

フラグメントとナビゲーション ドロワーを使用しているときにも、この問題に直面しました。あるフラグメントから別のフラグメントに移動すると、それらはすべて同じバックスタックに追加されます。そのため、この問題が発生しています。この問題を克服するために、私自身がバックスタックを維持し、バックプレスされたメソッドを処理しました

コードを投稿すると、問題の解決策を提案します

于 2013-09-19T12:23:05.697 に答える