0

我正在开发一个 android 项目,我正在尝试研究如何使用片段为我的应用程序制作一个平板电脑友好的 UI。但我不确定如何根据片段 A 中发生的情况更新片段 B。我知道我需要某种接口,但我不知道如何实现它。

基本上,我有一个名为 MainActivity 的活动,它设置片段的布局。

在横向模式下,XML 文件是。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="com.BoardiesITSolutions.FragmentTest.FragmentA"
        android:id="@+id/list"
        android:layout_weight="1"
        android:layout_width="0px"
        android:layout_height="match_parent">
    </fragment>
    <FrameLayout android:id="@+id/viewer"
        android:layout_weight="1"
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:background="?android:attr/detailsElementBackground">
    </FrameLayout>
</LinearLayout>

在纵向模式下

目前 MainActivity 只是SetContentViewonCreate方法中使用 inside 将内容视图设置为上面的 XML 文件。下面是它的外观。

片段布局

在 FragmentA 类文件中,它扩展了 ListFragment 并包含项目的 ListView,我想要做的是根据在 Fragment A 中选择的内容更新 Fragment B 中的 textview。

下面是片段 A 的代码。

@Override
    public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState)
    {
        return inflator.inflate(R.layout.fragment_a, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);

        myListView = getListView();

        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("Item1");
        arrayList.add("Item2");
        arrayList.add("Item3");

        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), 
                android.R.layout.simple_list_item_activated_1, arrayList);
        setListAdapter(arrayAdapter);

        View fragmentB = getActivity().findViewById(R.id.viewer);
        mDualPane = fragmentB != null && fragmentB.getVisibility() == View.VISIBLE;

        if (savedInstanceState != null)
        {
            mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
        }

        if (mDualPane)
        {
            myListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            showDetails(mCurCheckPosition);
        }
    }

    @Override
    public void onListItemClick(ListView l, View view, int position, long id)
    {
        showDetails(position);
    }

    private void showDetails(int index)
    {
        mCurCheckPosition = index;
        if (mDualPane)
        {
            myListView.setItemChecked(index, true);
            FragmentB details = (FragmentB)getFragmentManager().findFragmentById(R.id.viewer);
            if (details == null || details.getShownIndex() != index)
            {
                details = FragmentB.newInstance(index);

                FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.viewer, details);
                fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                fragmentTransaction.commit();
            }
        }
        else
        {
            Intent intent = new Intent(getActivity(), FragmentBActivity.class);
            intent.putExtra("index", index);
            startActivity(intent);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice", mCurCheckPosition);
    }

FragmentB 包含以下代码,该类扩展了 Fragment

public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState)
    {
        if (container == null)
        {
            return null;
        }
        View view = inflator.inflate(R.layout.fragment_b, container, false);
        return view;
    }

    public static FragmentB newInstance(int index)
    {
        FragmentB fragmentB = new FragmentB();
        Bundle args = new Bundle();
        args.putInt("index", index);
        //rgs.putString("content", content);
        fragmentB.setArguments(args);

        return fragmentB;
    }

    public int getShownIndex()
    {
        return getArguments().getInt("index", 0);
    }

在 FragmentB 的 Activity 文件中,它包含以下内容

@Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
        {
            finish();
            return;
        }

        if (savedInstanceState == null)
        {
            FragmentB fragmentB = new FragmentB();
            fragmentB.setArguments(getIntent().getExtras());
            getFragmentManager().beginTransaction().add(android.R.id.content, fragmentB).commit();
        }
    }

正如您从上面的屏幕截图中看到的那样,我有片段工作的基础,当我单击每个项目时,它会显示当前选择的项目是什么,但我不知道如何告诉它更新片段 b 中的文本视图基于用户从片段 a 中单击的内容以及在纵向和横向模式下如何处理。

感谢您的任何帮助,您可以提供。

4

2 回答 2

2

您可以覆盖 的onActivityCreated()方法FragmentB,通过该 TextView 的 id 查找视图,并对其进行更新。

这是一个模拟:

public class FragmentB extends Fragment{

    //......

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        TextView textView = getActivity().findViewById(R.id.my_textview);
        textView.setText("Hello World!");
    }
}
于 2012-09-09T21:09:50.817 回答
0

但我不知道如何告诉它根据用户从片段 a 中单击的内容以及在纵向和横向模式下如何处理它来更新片段 b 中的文本视图。

让 Fragment A 在宿主 Activity 上调用一个方法,让它知道用户点击了某些东西。然后托管活动可以调用 Fragment B 上的方法(如果该 Fragment 存在),或者启动 Fragment B(如果该 Fragment 不存在但有空间),或者启动一个负责显示 Fragment 的活动B(例如,在电话上)。

我不会做的是你正在做的事情:让片段 A 创建片段 B。片段 A 不应该关心片段 B 是否存在;这是活动的工作。片段 A 应该只关心片段 A,以及将必要的事件传递给活动。

于 2012-09-09T22:29:24.973 回答