我有以下情况:
带有片段-A的活动。
在用户输入时,使用以下代码添加一个新的片段(让我们称之为片段-B):
ft.add(R.id.content_frame, fragmentB);
现在,当我按下时,片段-B按预期被破坏。
由于片段B 添加(并且未被替换),因此片段A的onResume()
没有回调。
一旦片段B被破坏,我就需要设置片段A的焦点。
我使用下面的代码来设置焦点:
getView().setFocusableInTouchMode(true);
getView().requestFocus();
有没有办法实现这个目标?
答案 0 :(得分:3)
对于那些在片段( when fragments are added and NOT Replaced )
中努力获得“回调”的开发者,可以尝试以下方法:
使用addOnBackStackChangedListener
为片段后栈添加新的侦听器。
我在片段-A的addOnBackStackChangedListener
方法中添加了onCreate()
,如下所示:
getFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if (getView()!=null){
getView().setFocusableInTouchMode(true);
getView().requestFocus();
}
}
});
现在一旦Fragment-B被销毁,就会调用onBackStackChanged
并且我能够设置焦点。
当然,当Fragment被销毁时,您可以编写要在onBackStackChanged
内执行的任何代码。
答案 1 :(得分:0)
创建一个界面:
public interface DestructionListener {
void onDestroyed();
}
现在在FragmentB类中放置了Subject:
的实现private DestructionListener listener;
public void setDestructionListener(DestructionListener listener) {
this.listener = listener;
}
仍在相同的片段中,应用此类更改:
@Override
public void onDestroy() {
...
if(listener != null)
listener.onDestroyed();
super.onDestroy();
}
现在你已经实现了Listener模式 - 你可以监听FragmentB被销毁时发生的事件。在您的活动中,只需输入:
fragmentB.setDestructionListener(new DestructionListener() {
void onDestroyed() {
// Request focus here
}
});
你很高兴。
答案 2 :(得分:0)
您可以简单地隐藏片段(您不想要焦点)并显示您想要焦点的片段,因为您要添加片段而不是替换片段。