在Fragment中设置焦点

时间:2015-04-20 11:04:11

标签: android android-fragments

我有以下情况:

带有片段-A的活动。

在用户输入时,使用以下代码添加一个新的片段(让我们称之为片段-B):

ft.add(R.id.content_frame, fragmentB);

现在,当我按下时,片段-B按预期被破坏。

由于片段B 添加(并且未被替换),因此片段A的onResume()没有回调。

一旦片段B被破坏,我就需要设置片段A的焦点。

我使用下面的代码来设置焦点:

getView().setFocusableInTouchMode(true);
getView().requestFocus();

有没有办法实现这个目标?

3 个答案:

答案 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)

您可以简单地隐藏片段(您不想要焦点)并显示您想要焦点的片段,因为您要添加片段而不是替换片段。