片段按下后退按钮

Raj*_*epe 39 android back android-fragments

我现在有一个包含片段的活动

[1],[2],[3],[4]

如果按下按钮[3],可以将其重定向到[4]

我想实现后退按钮如下图所示..

当按下[4]时,返回[3]

当按下[3]时,返回[2]

当按下[1]时,活动结束();

当涉及到当前的实现时,它完成活动而不是弹出Fragment.你能告诉我我应该做什么或记住什么?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if( keyCode==KeyEvent.KEYCODE_BACK) 
    {   

        finish();
    }       

        return super.onKeyDown(keyCode, event); 

}   
Run Code Online (Sandbox Code Playgroud)

小智 88

这对我有用.

- 从活动中调用新片段时,添加.addToBackStack(null).

    FragmentTransaction mFragmentTransaction = getFragmentManager()
                .beginTransaction();
    ....
    mFragmentTransaction.addToBackStack(null);
Run Code Online (Sandbox Code Playgroud)

- 将onBackPressed()添加到您的活动中

    @Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() == 0) {
        this.finish();
    } else {
        getFragmentManager().popBackStack();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是来自SO,imho的最佳和最简单的解决方案 (4认同)

Hir*_*tel 54

最简单的方式:

onResume():

@Override
public void onResume() {
    super.onResume();

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
                // handle back button's click listener
                Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

编辑1:如果片段有EditText.

private EditText editText;
Run Code Online (Sandbox Code Playgroud)

onCreateView():

editText = (EditText) rootView.findViewById(R.id.editText);
Run Code Online (Sandbox Code Playgroud)

onResume():

@Override
public void onResume() {
    super.onResume();

    editText.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                editText.clearFocus();
            }
            return false;
        }
    });

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
                // handle back button's click listener
                Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

注意: 如果您在片段中有EditText,它将起作用.

完成


sav*_*ion 9

这对我来说是一个有效的解决方案:

dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
                    @Override
                    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                        if (keyCode == KeyEvent.KEYCODE_BACK) {
                            // DO WHAT YOU WANT ON BACK PRESSED
                            return true;
                        }
                        return false;
                    }
                });
Run Code Online (Sandbox Code Playgroud)

编辑:您可以用getView()片段替换对话框.

  • 什么是对话?它与片段有什么关系? (3认同)

Piy*_*ush 8

你可以用这个..为我工作..

看起来好像片段[3]在按下后面时没有从视图中移除,所以你必须手动完成!

首先,不要使用replace(),而是使用remove并单独添加.似乎replace()无法正常工作.

下一部分是重写onKeyDown方法,并在每次按下后退按钮时删除当前片段.

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event)
 {
 if (keyCode == KeyEvent.KEYCODE_BACK)
 {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0)
    {
        this.finish();
        return false;
    }
    else
    {
        getSupportFragmentManager().popBackStack();
        removeCurrentFragment();

        return false;
    }



 }

  return super.onKeyDown(keyCode, event);
 }


public void removeCurrentFragment()
{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.f_id);
}
Run Code Online (Sandbox Code Playgroud)


hit*_*esh 8

试试这个简单的方案:

在你的活动中实现onBackPressed

 @Override
    public void onBackPressed() {
       if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
            getSupportFragmentManager().popBackStack();
        } else {
            finish();
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您想在每次背压时弹出顶部片段,这将有效. 注意: - 在向活动添加片段时,总是将事务添加到后台,以使其工作


Ami*_*mar 5

在 Fragment 中按下或处理后退按钮的解决方案。

我解决问题的方法我相信它也会对您有所帮助:

1.如果您的片段中没有任何编辑文本框,您可以使用以下代码

这里 MainHomeFragment 是主要 Fragment (当我从第二个片段按后退按钮时,它也会带我 MainHomeFragment )

    @Override
    public void onResume() {

    super.onResume();

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){

                MainHomeFragment mainHomeFragment = new SupplierHomeFragment();
                android.support.v4.app.FragmentTransaction fragmentTransaction =
                        getActivity().getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment);
                fragmentTransaction.commit();

                return true;    
            }    
            return false;
        }
    }); }
Run Code Online (Sandbox Code Playgroud)

2.如果您有另一个名为 Somefragment 的片段,并且它有编辑文本框,那么您可以通过这种方式完成。

private EditText editText;
Run Code Online (Sandbox Code Playgroud)

然后在,

onCreateView():    
editText = (EditText) view.findViewById(R.id.editText);
Run Code Online (Sandbox Code Playgroud)

然后重写OnResume,

@Override
public void onResume() {
    super.onResume();

    editText.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                editTextOFS.clearFocus();
                getView().requestFocus();
            }
            return false;
        }
    });

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){

                MainHomeFragment mainHomeFragment = new SupplierHomeFragment();
                android.support.v4.app.FragmentTransaction fragmentTransaction =
                        getActivity().getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment);
                fragmentTransaction.commit();

                return true;

            }

            return false;
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

这就是大家(amitamie.com):-) ;-)


Hai*_*lik 5

在包含片段的活动的 onCreate() 中,添加一个 backstack 更改侦听器,如下所示:

    fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            List<Fragment> f = fragmentManager.getFragments();
            Fragment frag = f.get(0);
            currentFragment = frag.getClass().getSimpleName();
        }
    });
Run Code Online (Sandbox Code Playgroud)

(注意。我的 fragmentManager 被声明为全局)现在每次更改片段时,currentFragment 字符串将成为当前片段的名称。然后在 onBackPressed() 活动中,您可以像这样控制后退按钮的操作:

    @Override
    public void onBackPressed() {

    switch (currentFragment) {
        case "FragmentOne":
            // your code here 
            return;
        case "FragmentTwo":
            // your code here
            return;
        default:
            fragmentManager.popBackStack();
            // default action for any other fragment (return to previous)
    }

}
Run Code Online (Sandbox Code Playgroud)

我可以确认这种方法对我有用。

更新:科特林

override fun onBackPressed() {

    when(supportFragmentManager.fragments[0].javaClass.simpleName){
        "FragmentOne" -> doActionOne()
        "FragmentTwo" -> doActionTwo()
        else -> supportFragmentManager.popBackStack()
    }
}
Run Code Online (Sandbox Code Playgroud)