【问题标题】:Set a focus in Fragment在 Fragment 中设置焦点
【发布时间】:2017-01-17 10:58:03
【问题描述】:

我有以下情况:

一个带有 Fragment-A 的活动。

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

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

现在,当我回击时,片段 B 会按预期销毁。

由于片段 B 已添加(而不是替换),片段 A 的 onResume() 没有回调。

片段-B 被销毁后,我需要设置片段-A 的焦点。

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

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

有什么办法可以做到吗?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    对于那些在 Fragment( when fragments are added and NOT Replaced ) 中难以获得“回调”的开发者,可以尝试以下方法:

    使用addOnBackStackChangedListener 添加一个新的监听器,用于对片段返回堆栈的更改。

    我在 Fragment-A 的onCreate() 方法中添加了这个addOnBackStackChangedListener,如下:

    getFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() {
    
                @Override
                public void onBackStackChanged() {
                    if (getView()!=null){
                        getView().setFocusableInTouchMode(true);
                        getView().requestFocus();       
                    }               
                }
            });
    

    现在,一旦 Fragment-B 被销毁,onBackStackChanged 就会被调用,我可以设置焦点。

    当然,当 Fragment 被销毁时,您可以在 onBackStackChanged 中编写任何您想执行的代码。

    【讨论】:

      【解决方案2】:

      创建接口:

      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();
      }
      

      现在您已经实现了侦听器模式 - 您可以侦听在 FragmentB 被销毁时发生的事件。在您的活动中,只需输入:

      fragmentB.setDestructionListener(new DestructionListener() {
          void onDestroyed() {
              // Request focus here
          }
      });
      

      你可以走了。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-05
          • 1970-01-01
          • 1970-01-01
          • 2010-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多