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

时间:2012-05-22 03:47:03

标签: android android-fragments

我的Fragment:片段Activity中有两个A个按钮X,片段B带有按钮Y

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

3 个答案:

答案 0 :(得分:11)

从文档中

  

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

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

查看上面的链接......它提供了几个很好的例子。如果你仍然遇到麻烦,请告诉我,也许我可以更明确。


编辑#1:

假设您单击片段A中的按钮,您希望这会导致更改片段B中的按钮。以下是一些说明这个概念的示例代码:

回调接口:

public interface OnButtonClickedListener {
    public void onButtonClicked(); 
}

活动:

public class SampleActivity extends Activity implements OnButtonClickedListener {

    /* Implementation goes here */     

    public void onButtonClicked() {
        // This method is called from fragment A, and when it is called,
        //   it will send information to fragment B. Remember to first
        //   check to see if fragment B is non-null.

        /* Make call to a method in fragment B that will update its display */
    }
} 

片段A:

public class FragmentA extends Fragment {
    OnButtonClickedListener mListener;

    /* Implementation goes here */

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnButtonClickedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnButtonClickedListener ");
        }
    }

    public void clickButton() {
        // When the button is clicked, notify the activity.
        //   The activity will then pass the information to fragment
        //   B (if it has been created).

        mListener.onButtonClicked();
    }
}

编辑#2:

现在,您可能想知道,“为什么有人会遇到所有这些麻烦?当您可以让片段A直接操作片段{{1}时,创建单独的活动回调方法有什么意义? }?”

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

对不起,如果不清楚......我发现很难描述:P。通过这个tutorial工作可能会有所帮助......当您使用交互式多窗格布局时,活动回调会让您的生活变得更加轻松。

答案 1 :(得分:1)

基于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;
    }

} 

片段A:

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

}

片段B:

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

}

希望可以帮助别人。

答案 2 :(得分:0)

为布局中的按钮设置onClick属性,即使是片段的布局,也会在Activity上调用相应的方法。

然后,您的应用可以将此信号从Activity发送到片段B.