代码之家  ›  专栏  ›  技术社区  ›  Bread

如何在两个独立的片段中同步两个按钮

  •  0
  • Bread  · 技术社区  · 7 年前

    我该怎么做?最终目标是在每个片段上都有一个全局按钮。

    4 回复  |  直到 7 年前
        1
  •  1
  •   ray1195    7 年前

    您可以在活动中使用布尔标志,并在默认情况下将其设置为false;在任一片段中按下任一开关时,将其值设置为true;在导航到另一个片段时,检查标志值;如果为true,则将其打开或关闭。

        2
  •  1
  •   f0f1    7 年前

    如果不是,那么可以创建一个布尔偏好并在此基础上同步。希望这有帮助。如果你需要代码示例,请告诉我。

    public interface Listener {
     public boolean getFlag();
     public void setFlag(boolean enable);
    }
    
    public class SomeActivity extends AppCompatActivity implements Listener {
    // getFlag, setFlag implementation
    }
    
    public class FragmentA {
     private boolean state;
     private Listener listener;
     private Switch switchBtn;
    
     public void onAttach(Context ctx){
      listener = (Listener) this.getActivity();
      // check for ClassCast Exception
     }
     public void onActivityCreated() {
       state = listener.getFlag();
       switchBtn.setChecked(state);
     }
    }
    

    查看详细信息 this page

        3
  •  1
  •   hjchin    7 年前

    片段之间的通信示例。下面的示例修改自 Communicating with Other Fragments

    步骤1 . 创建接口

    public interface ButtonCallback{
        void onClick(boolean val)
    }
    

    . 在 HostActivity 它同时承载了片段A和片段B 实现接口 ButtonCallback .

    public class HostActivity extends AppCompatActivity implements ButtonCallback{
    
        void onClick(boolean val){
        }
    }
    

    步骤3 . 在片段A&B中,通过转换活动初始化回调

    class FragmentA extends Fragment{
    
        ButtonCallback callback;
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
    
            //Make sure activity host implement ButtonCallback interface
            try {
                callback= (ButtonCallback ) context;
            } catch (ClassCastException e) {
                throw new ClassCastException(activity.toString()
                + " must implement ButtonCallback");
            }
        }
    
        //public method to update fragment's button state
        public void setGlobalButtonState(boolean val){
            //globalButton has been initialized in onCreateView function
            globalButton.setEnabled(val);
        }
    }
    
    class FragmentB extends Fragment{
    
        ButtonCallback callback;
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
    
            try {
                callback= (ButtonCallback ) context;
            } catch (ClassCastException e) {
                throw new ClassCastException(activity.toString()
                + " must implement ButtonCallback");
            }
        }
    
        public void setGlobalButtonState(boolean val){
            //globalButton has been initialized in onCreateView function
            globalButton.setEnabled(val);
        }
    }
    

    步骤4 . 在片段A中,当用户单击按钮时调用ButtonCallback.on click(布尔值)

    globalButton.setOnClickListener(new View.OnClickListener(View v){
        Boolean value  = !v.isEnabled();
        callback.onClick(value)
    });
    

    步骤5 onClick 函数,找到一种方法来获取片段B,该片段B将引用您的上下文,并通过 setGlobalButtonState 功能

    void onClick(boolean val){
        //get Fragment B.
        fragmentB.setGlobalButtonState(val);
    }
    

        4
  •  0
  •   Shane Monks O'Byrne    7 年前

    以下是有关与其他片段通信的开发人员指南: https://developer.android.com/training/basics/fragments/communicating 在活动中具有共享属性。在每个片段中,转到父活动以在按钮单击时获取该属性。 要减少依赖性,请使用接口从活动获取数据,如提供的链接所示

    推荐文章