我不想让这个头衔长,所以我会在这里扩展它。我有一个片段(称为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代码没有被执行,这是有意义的)。这并不让我担心,但是当我第二次按回去返回上一个片段时,代码没有被执行。我相信对此有一个更深刻的理解,我似乎无法弄明白。
答案 0 :(得分:1)
尝试使用
@Override
public void onBackPressed() {
// do something on back.
return;
}
答案 1 :(得分:1)
片段由片段管理器管理,片段管理器由Activity调用;因此,要在单击后退按钮时控制您要执行的操作,您必须在活动中执行此操作;
现在,如果您有多个片段集,您应该使用标签来查找它们,检查它们是否可见,如果是,请执行上面提到的操作。
设置片段时,应该给它们一个标签,然后稍后使用此标签来查找FragmentByTagName(),并进行if检查以查看此刻设置的片段;如果您需要更多帮助,请告诉我。
我希望这有帮助!