【问题标题】:How to synchronize two buttons in two seperate fragments如何同步两个单独片段中的两个按钮
【发布时间】:2018-12-30 11:37:23
【问题描述】:

两个(开关)按钮是否可以在片段之间具有同步行为?即:当按钮 A 在片段 A 中打开时,我希望按钮 B 在片段 B 中的外观也显示为打开。

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

【问题讨论】:

    标签: android android-fragments android-button android-switch


    【解决方案1】:

    这取决于两个片段是否在同一个活动上。如果是,那么您只需要在所述活动上设置一个布尔标志,并根据它进行同步。

    如果不是,那么可能会创建一个布尔偏好并基于它进行同步。希望这可以帮助。如果您需要代码示例,请告诉我。

    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

    【讨论】:

    • 两个片段都在单个活动上通过寻呼机适配器运行。可以举个例子吗?
    • 我如何获得旗帜?
    • 您能补充更多细节吗?
    【解决方案2】:

    您可以在活动中使用布尔标志并将其默认设置为 false,当在任一片段中按下任何开关时,将其值设置为 true,当您导航到另一个片段时,然后检查标志值以及是否true 然后将其打开或关闭。

    【讨论】:

    • 你有例子吗?
    【解决方案3】:

    这里是与其他 Fragment 通信的开发者指南:https://developer.android.com/training/basics/fragments/communicating。 在activity中有shared属性。在每个片段中,转到父活动以在按钮单击时获取该属性。 为了减少依赖,使用接口从活动中获取数据,如提供的链接所示

    【讨论】:

    • 你有开关按钮的例子吗?
    【解决方案4】:

    片段之间的通信示例。下面的例子是从Communicating with Other Fragments修改而来的

    第 1 步。创建接口

    public interface ButtonCallback{
        void onClick(boolean val)
    }
    

    第 2 步。在同时承载片段A和B的HostActivity中,使HostActivity实现接口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 步。在 Fragment A 中,当用户点击按钮时调用 ButtonCallback.onClick(boolean)

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

    第 5 步。在 HostActivity 的 onClick 函数中,找到一种方法来获取适合您上下文的 Fragment B,并通过 setGlobalButtonState 函数更新 Fragment B 中的按钮

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

    附加说明,如果按钮是全局的,如果适合您的上下文,则可能值得考虑将按钮放在主机 Activity 上。

    【讨论】:

    • 在第 1 步中,是否应该在我的基本片段类中创建接口?
    • 如果适合您的需要,您可以这样做。设计总是为了解决问题,如果你觉得合适,我会同意你创建一个基础片段。
    • 在第 3 步中,“onAttach(Activity...”已弃用。将“Activity”一词更改为“Context”可修复错误。这将如何影响其余代码?它可以运行吗?在 KitKat Api 上?
    • 我错过了一个支架,我把它修好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2016-11-23
    • 2021-09-27
    • 2020-04-08
    • 2019-08-01
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多