键盘弹出后没有触发后退按钮代码

时间:2014-03-14 14:59:11

标签: android android-fragments keylistener android-keypad

我不想让这个头衔长,所以我会在这里扩展它。我有一个片段(称为Signatures),当我按下该片段中的后退按钮时,我想调用一个方法来保存控件的数据(EditText字段等)。因此我实现了OnKeyListener(),以便我可以调用我的save方法。这就是我的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代码没有被执行,这是有意义的)。这并不让我担心,但是当我第二次按回去返回上一个片段时,代码没有被执行。我相信对此有一个更深刻的理解,我似乎无法弄明白。

2 个答案:

答案 0 :(得分:1)

尝试使用

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

答案 1 :(得分:1)

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

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

设置片段时,应该给它们一个标签,然后稍后使用此标签来查找FragmentByTagName(),并进行if检查以查看此刻设置的片段;如果您需要更多帮助,请告诉我。

我希望这有帮助!