当前位置: 首页 > 知识库问答 >
问题:

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

谭安翔
2023-03-14

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

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

共有3个答案

周超英
2023-03-14

片段之间的通信示例。下面的示例修改为与其他片段通信

第一步。创建一个接口

public interface ButtonCallback{
    void onClick(boolean val)
}

第二步。在托管片段A和片段B的HostActivity中,使HostActivity实现接口按钮callback

public class HostActivity extends AppCompatActivity implements ButtonCallback{

    void onClick(boolean val){
    }
}

第三步。在片段A中

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

第四步。在片段A中,调用ButtonCallback。当用户单击按钮时单击(布尔值)

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

第五步。在HostActive的on点击函数中,找到一种方法来获取与您的上下文相匹配的片段B,并通过setGlobalButtonState函数更新片段B中的按钮

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

另外注意,如果这个按钮是全局的,那么如果它适合你的上下文,就可以考虑将按钮放在主机活动上。

闻人杰
2023-03-14

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

如果没有,那么可能创建一个布尔首选项并基于此进行同步。希望这有帮助。如果您需要代码示例,请告诉我。

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

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

贝浩歌
2023-03-14

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

 类似资料:
  • 问题内容: 我有很多对象。 如何按名称和年龄先后按字母顺序对该数组排序? 您将使用哪种算法? 问题答案: 你可以使用以下方法: 现在按名称排序,然后按年龄排序。 “从字典上比较两个字符串”-来自docs。 是本机库中的静态方法。它会进行实际的排序,你只需要提供一个即可定义应该如何比较列表中的两个元素:这是通过提供你自己的方法实现来实现的。

  • 我有对象数组。 如何按名称和年龄按字母顺序对该数组进行排序? 你会使用哪种算法?

  • 我需要创建一个按钮,如下所示: HTML 如何在JS文档中指定这些函数?

  • 问题内容: 我想使用rsync 在两个方向上 同步 两个目录。 我指的是经典意义上的同步( 不是 rsync手册中的含义): 我想 双向 更新目录,具体取决于哪个 更新 。 可以通过rsync (在Linux方式中更可取) 完成此操作吗? 如果没有,还有哪些其他解决方案? 问题答案: 只需使用“较新”模式(-u或– update标志)加上-t(复制文件修改时间),-r(用于递归文件夹)和-v(用于

  • 我有两份清单: 我想要一个新的名单,比如: 我尝试了以下方法: 但有一些严重的错误

  • 我写了一个启动两个线程的代码片段;一个线程打印所有奇数,而另一个线程打印所有偶数。我使用了内在锁和线程通信命令的组合来实现两个线程的正确交叉。这是我的代码, 以下是我的问题: > 奇数线程在printOdd()函数中执行,而偶数线程在print偶数()函数中执行。我对两个线程都使用一个内在锁;我不明白两个线程怎么能同时存在于各自的同步块中,因为使用了相同的锁。 我从代码中删除了线程通信语句(通知,