3

Fragment我的 s 中有两个ActivityA带有按钮的片段和带有按钮的X片段。BY

单击按钮时如何更改按钮X的背景图像B?是否可以?

4

3 回答 3

11

从文档中,

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

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

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


编辑#1:

假设您单击 fragment 中的一个按钮,A并且您希望这会导致对 fragment 中的按钮进行更改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:

现在,您可能想知道,“为什么有人会经历所有这些麻烦?当您可以让 fragmentA直接操作 fragment时,创建一个单独的活动回调方法有什么意义B?”

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

抱歉,如果不清楚...我发现很难描述:P。按照您的方式学习本教程可能会有所帮助...当您使用交互式多窗格布局时,活动回调使您作为开发人员的生活特别轻松。

于 2012-05-22T03:54:37.473 回答
1

基于亚历克斯洛克伍德的回答:

活动:

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

}

希望可以帮助某人。

于 2014-03-28T09:33:59.933 回答
0

在布局中设置onClick按钮的属性,甚至是片段的布局,都会在Activity.

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

于 2014-02-09T09:30:45.647 回答