0

私は実際にはアクティビティではなくフラグメントに取り組んでいます。そのため、ナビゲーションドロワーアイテムをクリックすると、画面にさまざまなフラグメントが表示されます。コードに基づいて、アクティビティAからフラグメントbに移動している場合、フラグメントc、再びbに移動している場合、戻るボタンをクリックすると、MainActivity A に移動します。しかし、ここに問題があります。ページは開いていますが、バックスタックにフラグメントが残っていない場合にのみ表示したい.その問題について助けが必要です.

    Here is my MainActivity code:--

    package archerpenny.impdrawerfragment;


import android.content.DialogInterface;
import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;
import android.support.v4.widget.DrawerLayout;

import android.os.Bundle;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;

import android.view.MenuItem;

import android.view.View;


public class MainActivity extends AppCompatActivity  {
    ActionBarDrawerToggle mDrawerToggle;
    RecyclerView.Adapter mAdapter;
    RecyclerView recyclerView;
    DrawerLayout mDrawerLayout;
    FragmentManager fragmentManager;
    Fragment blankFragment=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAdapter = new NavigationDrawerAdapter(this);
        mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        NavigationDrawerAdapter adapter;

        recyclerView = (RecyclerView)findViewById(R.id.DrawerList);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager llm = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(llm);
        recyclerView.setAdapter(mAdapter);

        getSupportActionBar().setDisplayShowTitleEnabled(false);

        mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout,toolbar,R.string.open,R.string.close) {
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
            }
        };

        mDrawerLayout.setDrawerListener(mDrawerToggle);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        recyclerView.addOnItemTouchListener(
                new RecyclerItemClickListener(MainActivity.this, new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        // do whatever

                        if(position==0)
                        {
                            blankFragment=new BlankFragment();

                        }
                        if (position==1)
                        {
                            blankFragment=new BlankFragment2();
                        }
                        if (position==2)
                        {
                            blankFragment=new BlankFragment3();
                        }
                        android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
                        getSupportFragmentManager().popBackStack();
                        fragmentManager.beginTransaction()
                                .add(R.id.container_body, blankFragment).addToBackStack("fragBack").commit();
                        mDrawerLayout.closeDrawers();
                    }
                })
        );
    }
    @Override
    public void onBackPressed() {
        if(getSupportFragmentManager().findFragmentByTag("fragBack") != null)
        {
            getSupportFragmentManager().popBackStack();
            getSupportFragmentManager().beginTransaction().add(R.id.container_body, blankFragment).addToBackStack("fragBack").commit();
        }
        else {
            new AlertDialog.Builder(this)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .setTitle("Closing Activity")
                    .setMessage("Are you sure you want to close this activity?")
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }

                    })
                    .setNegativeButton("No", null)
                    .show();



        }
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}
4

2 に答える 2

2

その「fragBack」タグの再利用に頼っている理由がわかりませんか? バックスタックは、必要なものすべてを提供します。次のようなことを試してください。

public void onBackPressed() {
    FragmentManager fragMgr = getSupportFragmentManager();
    if (fragMgr.getBackStackEntryCount() > 0) {
        fragMgr.popBackStackImmediate(); //or whatever
    } else {
        //show the dialog 
    }
}
于 2015-08-04T14:05:35.183 に答える
0

すべてのフラグメントを処理するアクティビティ内で、使用します

@Override
public void onBackPressed() {
int count = getSupportFragmentManager().getBackStackEntryCount();
if (count == 0) {   

super.onBackPressed();      

//you can add your alertdialog code here and after pressing positive button of alertdialog you can call super.onBackPressed()      
}
else {            
      getSupportFragmentManager().popBackStack();            
   }
}

フラグメント バックスタック エントリ カウントが 0 の場合、すべてのフラグメントがバックスタックから取り出されたことを意味します。そのため、次に super.onBackPressed() を実行するだけです。ただし、スタックが空でない場合、[戻る] ボタンを押したときに、適切な戻るナビゲーションが行われるように、バックスタックから最上位のフラグメントをポップする必要があります。

これがお役に立てば幸いです。ただし、フラグメントを正しく追加/置換しているかどうかわからない場合は、この投稿で私の回答を参照してください。

于 2015-08-04T17:59:27.097 に答える