Android 如何从片段B访问片段A的按钮

Android 如何从片段B访问片段A的按钮,android,android-fragments,Android,Android Fragments,在我的活动中有两个片段:带有按钮X的片段A和带有按钮Y的片段B 单击按钮B时,如何更改按钮X的背景图像?可能吗?从文档中 因为每个片段都用自己的生命周期回调定义自己的布局和行为,所以您可以在多个活动中包含一个片段,因此您应该为重用而设计,避免直接从另一个片段中操作一个片段 话虽如此,你想做的是。这样做的一个好方法是在片段内定义回调接口,并要求宿主活动实现它。当活动通过接口接收回调时,它可以根据需要与布局中的其他片段共享信息。这是在两个独立的Fragments之间共享事件的推荐方法,即通过活动共享

在我的
活动中有两个
片段
:带有按钮
X的片段
A
和带有按钮
Y的片段
B


单击按钮
B
时,如何更改按钮
X
的背景图像?可能吗?

从文档中

因为每个片段都用自己的生命周期回调定义自己的布局和行为,所以您可以在多个活动中包含一个片段,因此您应该为重用而设计,避免直接从另一个片段中操作一个片段

话虽如此,你想做的是。这样做的一个好方法是在片段内定义回调接口,并要求宿主活动实现它。当活动通过接口接收回调时,它可以根据需要与布局中的其他片段共享信息。这是在两个独立的
Fragment
s之间共享事件的推荐方法,即通过活动共享事件

查看上面的链接。。。它提供了几个很好的例子。如果你仍然有问题,让我知道,也许我可以更明确


编辑#1: 假设您单击片段
a
中的一个按钮,并希望这会导致对片段
B
中的一个按钮进行更改。下面是一些示例代码,演示了该概念:

回调接口: 活动: 片段A:
编辑#2: 现在,您可能想知道,“为什么有人会经历所有这些麻烦?当您可以让fragment
a
直接操作fragment
B
时,创建单独的活动回调方法有什么意义?”

您希望这样做的主要原因是确保每个片段都设计为一个模块化和可重用的活动组件。这一点尤其重要,因为模块化片段允许您更改不同屏幕大小的片段组合。在设计同时支持平板电脑和手机的应用程序时,您可以在不同的布局配置中重用片段,以根据可用的屏幕空间优化用户体验。例如,在手机上,当一个活动中不能容纳多个片段时,可能需要分离片段以提供单个窗格UI。使用活动回调可以确保在屏幕上看不到片段
B
的情况下可以轻松地重用片段。例如,如果您在手持设备上,没有足够的空间显示片段
B
,那么您可以轻松地进行活动检查,查看当前屏幕上是否显示片段
B


抱歉,如果这不清楚。。。我发现很难描述:P.通过你的方式解决这个问题可能会有帮助。。。使用交互式多窗格布局时,活动回调使开发人员的工作更加轻松。

为布局中的按钮(甚至片段的布局)设置
onClick
属性,将调用
活动中的相应方法


然后,您的应用程序可以将此信号从您的
活动发送到片段B。

基于Alex Lockwood的回答:

活动:

public class SampleActivity extends Activity{

    public interface OnButtonClickedListener {
           public void onButtonClicked(); 
    }

    private OnButtonClickedListener onButtonClickedListener = null;

    public OnButtonClickedListener getOnButtonClickedListener () {
           return onButtonClickedListener 
    }

    public void setOnButtonClickedListener (
        OnButtonClickedListener onButtonClickedListener {
           this.onButtonClickedListener  = onButtonClickedListener;
    }

} 
public class FragmentA extends Fragment {

private OnButtonClickedListener onButtonClickedListener = null;

private OnClickListener actionBarClickListener = new OnClickListener() {

    @Override
    public void onClick(View view) {
        if (onButtonClickedListener == null){
            onButtonClickedListener = ((SampleActivity) getActivity()).onButtonClickedListener ();
        }
        if (onButtonClickedListener != null) {
            onButtonClickedListener
                    .onButtonClicked();
        }
    }
};
    public class FragmentB extends Fragment {

private OnButtonClickedListener onButtonClickedListener = new OnButtonClickedListener() {

    @Override
    public void onButtonClicked() {

        Toast.makeText(getActivity(), "Button clicked", Toast.LENGTH_SHORT).show();
    }
};

@Override
public void onResume() {
    super.onResume();
    SampleActivity sampleActivity = (SampleActivity) getActivity();
    sampleActivity.setSearchBoxTextChangedListener(onButtonClickedListener);
}
片段A:

public class SampleActivity extends Activity{

    public interface OnButtonClickedListener {
           public void onButtonClicked(); 
    }

    private OnButtonClickedListener onButtonClickedListener = null;

    public OnButtonClickedListener getOnButtonClickedListener () {
           return onButtonClickedListener 
    }

    public void setOnButtonClickedListener (
        OnButtonClickedListener onButtonClickedListener {
           this.onButtonClickedListener  = onButtonClickedListener;
    }

} 
public class FragmentA extends Fragment {

private OnButtonClickedListener onButtonClickedListener = null;

private OnClickListener actionBarClickListener = new OnClickListener() {

    @Override
    public void onClick(View view) {
        if (onButtonClickedListener == null){
            onButtonClickedListener = ((SampleActivity) getActivity()).onButtonClickedListener ();
        }
        if (onButtonClickedListener != null) {
            onButtonClickedListener
                    .onButtonClicked();
        }
    }
};
    public class FragmentB extends Fragment {

private OnButtonClickedListener onButtonClickedListener = new OnButtonClickedListener() {

    @Override
    public void onButtonClicked() {

        Toast.makeText(getActivity(), "Button clicked", Toast.LENGTH_SHORT).show();
    }
};

@Override
public void onResume() {
    super.onResume();
    SampleActivity sampleActivity = (SampleActivity) getActivity();
    sampleActivity.setSearchBoxTextChangedListener(onButtonClickedListener);
}
}

片段B:

public class SampleActivity extends Activity{

    public interface OnButtonClickedListener {
           public void onButtonClicked(); 
    }

    private OnButtonClickedListener onButtonClickedListener = null;

    public OnButtonClickedListener getOnButtonClickedListener () {
           return onButtonClickedListener 
    }

    public void setOnButtonClickedListener (
        OnButtonClickedListener onButtonClickedListener {
           this.onButtonClickedListener  = onButtonClickedListener;
    }

} 
public class FragmentA extends Fragment {

private OnButtonClickedListener onButtonClickedListener = null;

private OnClickListener actionBarClickListener = new OnClickListener() {

    @Override
    public void onClick(View view) {
        if (onButtonClickedListener == null){
            onButtonClickedListener = ((SampleActivity) getActivity()).onButtonClickedListener ();
        }
        if (onButtonClickedListener != null) {
            onButtonClickedListener
                    .onButtonClicked();
        }
    }
};
    public class FragmentB extends Fragment {

private OnButtonClickedListener onButtonClickedListener = new OnButtonClickedListener() {

    @Override
    public void onButtonClicked() {

        Toast.makeText(getActivity(), "Button clicked", Toast.LENGTH_SHORT).show();
    }
};

@Override
public void onResume() {
    super.onResume();
    SampleActivity sampleActivity = (SampleActivity) getActivity();
    sampleActivity.setSearchBoxTextChangedListener(onButtonClickedListener);
}
}


希望能帮助别人。

谢谢Alex,但我不知道从哪里开始。让我们看看我是否知道它将如何工作。所以我必须在
片段A
中创建一个接口,然后
片段B
将实现它?还是活动会?哎呀,我没有仔细阅读。活动必须实现接口。因此,为了使活动更改
片段A
按钮X
,我必须在
片段B
上创建界面?我说的对吗?只是在我的帖子里多加了一点。。。如果有帮助,请告诉我!仍在努力理解一切…:你帮的太多了。无论如何,我有问题,接口的声明去哪里了?也在fragment
A
上?如果需要,可以在fragment
A
中将其声明为公共接口。您也可以在其单独的
.java
文件中声明它。没关系。此外,您只希望活动实现接口。活动是应该实现
onButtonClicked
方法的唯一类。。。片段A将调用此方法,并从那里将响应转发到片段
B
。这有意义吗?很高兴我至少能帮上一点忙:)。