【发布时间】:2018-12-30 11:37:23
【问题描述】:
两个(开关)按钮是否可以在片段之间具有同步行为?即:当按钮 A 在片段 A 中打开时,我希望按钮 B 在片段 B 中的外观也显示为打开。
我该怎么做?最终目标是在任一片段上都有一个全局按钮。
【问题讨论】:
标签: android android-fragments android-button android-switch
两个(开关)按钮是否可以在片段之间具有同步行为?即:当按钮 A 在片段 A 中打开时,我希望按钮 B 在片段 B 中的外观也显示为打开。
我该怎么做?最终目标是在任一片段上都有一个全局按钮。
【问题讨论】:
标签: android android-fragments android-button android-switch
这取决于两个片段是否在同一个活动上。如果是,那么您只需要在所述活动上设置一个布尔标志,并根据它进行同步。
如果不是,那么可能会创建一个布尔偏好并基于它进行同步。希望这可以帮助。如果您需要代码示例,请告诉我。
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
【讨论】:
您可以在活动中使用布尔标志并将其默认设置为 false,当在任一片段中按下任何开关时,将其值设置为 true,当您导航到另一个片段时,然后检查标志值以及是否true 然后将其打开或关闭。
【讨论】:
这里是与其他 Fragment 通信的开发者指南:https://developer.android.com/training/basics/fragments/communicating。 在activity中有shared属性。在每个片段中,转到父活动以在按钮单击时获取该属性。 为了减少依赖,使用接口从活动中获取数据,如提供的链接所示
【讨论】:
片段之间的通信示例。下面的例子是从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 上。
【讨论】: