有一个 OnBackPressed() 警告框只显示 3 个片段中的 2 个

Have an OnBackPressed() alert box to appear only for 2 out of the 3 fragments

我正在寻找一种方法,当用户在编辑笔记和添加笔记片段时按下后退导航按钮而不是在视图中时出现 "Are you sure you have finished?" 警告框注意片段。下面我附上了每个片段链接到的 activity 中的代码。如果您需要更多来自不同领域的代码,请告诉我。

public class NoteDetailActivity extends AppCompatActivity {


    public static final String NEW_NOTE_EXTRA = "New Note";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_note_detail);
        createAndFragment();
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        getSupportActionBar().setHomeButtonEnabled(false);


    }


    private void createAndFragment(){

        Intent intent = getIntent();
        MainActivity.FragmentToLaunch fragmentToLaunch = (MainActivity.FragmentToLaunch) intent.getSerializableExtra(MainActivity.NOTE_FRAGMENT_TO_LOAD_EXTRA);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        switch(fragmentToLaunch){
            case EDIT:
                NoteEditFragment noteEditFragment = new NoteEditFragment();
                setTitle(R.string.edit_fragment_title);
                fragmentTransaction.add(R.id.note_container, noteEditFragment, "NOTE_EDIT_FRAGMENT");
                break;
            case VIEW:
                NoteViewFragment noteViewFragment = new NoteViewFragment();
                setTitle(R.string.view_fragment_title);
                fragmentTransaction.add(R.id.note_container, noteViewFragment, "NOTE_VIEW_FRAGMENT");
                break;
            case CREATE:
                NoteEditFragment noteCreateFragment = new NoteEditFragment();
                setTitle(R.string.create_fragment_title);

                Bundle bundle = new Bundle();
                bundle.putBoolean(NEW_NOTE_EXTRA, true);
                noteCreateFragment.setArguments(bundle);

                fragmentTransaction.add(R.id.note_container, noteCreateFragment, "NOTE_CREATE_FRAGMENT");
                break;

        }

        fragmentTransaction.commit();

    }
    @Override
    public void onBackPressed() {
        new AlertDialog.Builder(this)
                .setMessage("Are you sure you want to exit?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        NoteDetailActivity.this.finish();
                    }
                })
                .setNegativeButton("No", null)
                .show();
    }
}

通过获取片段标签来做到这一点

像这样获取标签

 Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_container);
            String tag = fragment.getTag(); // This will return the tag of fragment

然后使用if-else来完成任务

  if (tag.equalsIgnoreCase("Home")) {
// Open aLERT box
}else  if (tag.equalsIgnoreCase("Home2")) {
// Open aLERT box
}else  if (tag.equalsIgnoreCase("Home2")) {
// Open aLERT box
}else{
// dO STUFF HERE
}

不要忘记添加片段标签

首先,尽量不要使用静态标签作为fragment的名称。相反,您可以将片段的名称设置为 ABCFragment.class.getSimpleName().

现在要检查对话框,创建一个方法

 /**
 * This method is used to get the top fragmnet on the stack
 *
 * @return {@link Fragment}
 */
protected final Fragment getTopFragmentStack() {
    FragmentManager fm = getSupportFragmentManager();
    Fragment fragment = null;
    for (int entry = 0; entry < fm.getBackStackEntryCount(); entry++) {
        fragment = fm.findFragmentByTag(fm.getBackStackEntryAt(entry)
                .getName());
    }
    return fragment;
}

在此之后检查哪个片段是可见的,你可以使用下面的代码

 Fragment topRunningFragment = getTopFragmentStack();
    if (topRunningFragment instanceof ABCFragment) {
        showDialog();
    } else if (topRunningFragment instanceof ABCDFragment) {
        showDialog();
    } else if (topRunningFragment instanceof ABCDEFragment) {
       // Do nothing
    }