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



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

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

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

这将取决于两个片段是否处于相同的活动中。如果是,那么您只需要在所述活动上设置一个布尔标志,同步取决于此。

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

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

有关详细信息,请查看此页面

片段之间的通信示例。下面的示例是从与其他片段通信修改而来的

步骤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。在片段A中,当用户点击按钮时,调用ButtonCallback.onClick(布尔值(

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

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

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

另外请注意,如果该按钮是全局的,那么如果适合您的上下文,则可能值得考虑将该按钮放在主机"活动"上。

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

最新更新