引用同一活动中不同片段的视图

时间:2014-01-17 11:31:29

标签: android android-fragments

假设目标应用程序是由3个片段构建的,这些片段都在同一个活动中public class MainActivity extends android.support.v4.app.FragmentActivity implements ActionBar.TabListener。起始片段为public class ButtonSectionFragment extends Fragment,其中有Button

public class ButtonSectionFragment extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.btn, container, false);
    Button mybutton = (Button) rootView.findViewById(R.id.mybutton);

    mybutton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        ????????????????????

    }
});
}

??方法中有onClick,我会谈到这一点。还有另一个像这样的片段:

public static class TextSectionFragment extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.tv, container, false);

    TextView textv = (TextView) rootView.findViewById(R.id.texty);
}

两个片段都使用不同的布局,因此这就是rootView正好在findViewById前面使用的原因。

我希望实现的结果是:通过第一个片段的Button点击,将TextView从第二个片段设置为Hello。我应该在???部分放置什么才能使它全部工作?

4 个答案:

答案 0 :(得分:2)

您需要使用interface作为活动的回调,然后在fragment中设置textview。

两个framgents永远不应该直接沟通。

http://developer.android.com/training/basics/fragments/communicating.html

Framgent1 - >活动 - > Fragment2。

您可以先将片段2中的值与活动进行通信,然后再将活动中的值从片段2发送到片段2。然后在fragment2中设置文本

答案 1 :(得分:1)

您只需使用getActivity().findViewById()代替getView().findViewById()

final TextView tv = (TextView) getActivity().findViewById(R.id.texty);
if (tv != null)
   tv.setText("Hello");

片段只是活动的公共布局树中的分支。可以通过Activity.findViewByXXX()访问公共活动的所有片段视图。唯一的复杂因素是可以动态添加,删除,替换片段等。因此,您需要确保所需的片段已经膨胀到布局层次结构中。您可以在另一个片段的onViewCreated()中初始化UI。这可以保证您已经加载了布局。

答案 2 :(得分:0)

    Fragment frag1 = new ButtonSectionFragment ();
    Fragment frag2 = new TextSectionFragment();
    FragmentManager         fm      = getSupportFragmentManager();
    FragmentTransaction     ft      = fm.beginTransaction(); 

    ft.add(layout, frag1);
    ft.add(layout, frag2);
    ft.commit();

    View frag1RootView = frag1.getView();
    View frag2RootView = frag2.getView();

    Button btn = (Button)frag1RootView.findViewById(id);
    TextView tv = (TextView)frag2RootView.findViewById(id);

未经测试但......我认为会这样做......

编辑:您应该获得onActivityCreated();或者它会给你一个空的......

答案 3 :(得分:0)

继续Raghunandan的回答,你可以检查链接中的类似实现。

update TextView in fragment A when clicking button in fragment B

不要忘记将TextSectionFragment的textview引用到MainActivity中。