【问题标题】:Back button code not firing after keyboard popup键盘弹出后后退按钮代码未触发
【发布时间】:2014-03-14 14:59:11
【问题描述】:

我不想让标题太长,所以我会在这里展开。我有一个片段(称为签名),当我按下该片段中的后退按钮时,我想调用一个方法来保存控件的数据(EditText 字段等)。因此,我实现了一个OnKeyListener(),以便我可以调用我的保存方法。这就是我的 keyListener 的样子。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    context = getActivity();

    textFields = new ArrayList<EditText>();//These will store my dynamically generated controls
    signatures = new ArrayList<DrawingView>();//These will store my dynamically generated controls

    view = inflater.inflate(R.layout.signatures, container, false);


    view.setFocusableInTouchMode(true);
    view.requestFocus();
    view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if( keyCode == KeyEvent.KEYCODE_BACK )
            {
                storeData();//This method will save all the data

                getFragmentManager().popBackStack("signature", FragmentManager.POP_BACK_STACK_INCLUSIVE);
                return true;
            }
            else
            {
                return false;
            }
        }
    });

    //Create the main layout
    RelativeLayout mainLayout = (RelativeLayout)view.findViewById(R.id.mainLayout);

    //Dynamically generate the layout
    setupPage(mainLayout);

    return view;
}

所以这就是问题所在。我将单击将启动此片段(签名)的前一个片段。该片段将启动没有键盘弹出的问题。如果我按下后退按钮,它将启动 keyListener 代码没问题。但是,一旦我单击 EditText 并弹出键盘,如果我按回以清除键盘,则没有任何反应(这意味着 keyListener 代码没有被执行,这是有道理的)。这并不让我担心,但是当我第二次按下返回到上一个片段时,代码不会被执行。我相信对此有更深的理解,我似乎无法弄清楚。

【问题讨论】:

    标签: android android-fragments keylistener android-keypad


    【解决方案1】:

    Fragment 由 Activity 调用的 Fragment Manager 管理;因此,要控制单击后退按钮时要执行的操作,您必须在 Activity 中执行此操作;

    现在,如果您有多个片段集,您应该使用标签来查找它们,检查它们是否可见,如果是,请执行上述操作。

    在设置你的片段时,你应该给他们一个标签,然后使用这个标签来findFragmentByTagName()并做一个if检查来看看现在设置了哪个片段;如果您需要更多帮助,请告诉我。

    我希望这会有所帮助!

    【讨论】:

    • 我一直试图弄清楚如何做到这一点已经有一段时间了。我知道你可以做到onBackPressed(),但从未意识到我可以在我的背压中使用 FragmentManager。我一直试图弄清楚如何在片段中使用onBackPressed。感谢您为我指明正确的方向。
    • 很高兴能帮上忙!
    • @Eenvincible 我也有同样的问题,但是在 ViewPager 里面也是内部片段的第二层,所以我不能使用这个解决方案,你有什么建议吗?
    • 我不确定我是否清楚地了解了您的问题。你能详细说明一下吗?
    【解决方案2】:

    尝试使用

    @Override
    public void onBackPressed() {
        // do something on back.
        return;
    }
    

    【讨论】:

    • 在我的片段代码中?如果我这样做了,它会给我一个错误,说“方法不会覆盖其超类中的方法”,如果我把它放在我的活动中,那么如何控制哪个片段正在调用后退按钮
    • 看我上面回答的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2012-04-18
    • 2011-08-17
    • 2017-05-09
    相关资源
    最近更新 更多