1

我打算将现有的 android 应用程序转换为片段布局。

这个想法是拥有经典的两个面板布局(左侧的项目列表,右侧的详细信息)。

实际上,该应用程序由 4 个活动组成:

  1. 具有所有可用选项的 ChoiceListActivity
  2. 3 种不同的活动,针对工具上可用的每个操作进行一项。

现在我开始进行转换并创建了一个 FragmentActivity 类,这是主类:

    public class MainFragment extends FragmentActivity {

    private static final String TAG = "MainFragment";

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        if(findViewById(R.id.fragment_container)!=null){
            Log.i(TAG, "No Tablet");
            Intent i = new Intent(MainFragment.this, main.ChoiceActivity.class);
            startActivity(i);
        } else {
            Log.i(TAG, "Tablet");
        }
    }
}

我创建了一个 ChoiceListFragment:`

public class ChoiceListFragment extends ListFragment {

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Toast.makeText(getActivity(), getListView().getItemAtPosition(position).toString(), Toast.LENGTH_LONG).show();
        super.onListItemClick(l, v, position, id);
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        String[] options = getResources().getStringArray(R.array.listitems);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(inflater.getContext(), R.layout.list_item, options);
        setListAdapter(adapter);
        return super.onCreateView(inflater, container, savedInstanceState);
    }

}

该片段将位于面板的左侧。

我的问题是右侧。这个想法是,对于列表的每个元素,将显示相应的活动(或片段?)。

那么正确的方法是什么?

  1. 当用户选择一个项目时,在正确的片段中启动一个活动是个好主意吗?

  2. 或者我必须以编程方式在片段之间切换?以及如何做到这一点(我找到了很多教程,但他们总是使用相同的活动来更改右侧面板中的一些数据)?

我为正确的片段创建了以下类(但我不确定我做对了):

public class RightFragment extends Fragment {

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

    }

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


}

我注意到我最终可以在 onCreate 方法期间使用 LayoutInflater 对象更改布局,但这只是在屏幕上切换布局,布局中声明的对象未初始化(也未添加 eventListener 等)。那么该怎么做呢?

也许我应该创建一个 Intent 并使用 startActivity 来启动现有的活动,或者这是一个片段的坏主意?

实际上xml布局是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <fragment
        android:id="@+id/choicelist_fragment"
        android:name="main.fragments.ChoiceListFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <fragment
        android:id="@+id/right_fragment"
        android:name="main.fragments.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />

</LinearLayout> 
4

2 回答 2

1

好的,我找到了自己的解决方案,一开始还不清楚,但是阅读了一些文档,查看了许多教程,也许我了解它是如何工作的。

首先,我从布局中删除了第二个片段 *right_fragment*(检查问题),我用一个名为 *activity_container* 的空 FrameLayout 替换它,这将是我的片段的容器。

背后的想法是简单地使用 FragmentManager 来替换容器内的片段。

所以我将onListItemClick方法更新到 ChoiceListFragment 中,并根据所点击的列表项创建一个新的 Fragment 并将其替换为 *activity_container*。更新的方法类似于以下:

public void onListItemClick(ListView l, View v, int position, long id) {            
        String itemName = getListView().getItemAtPosition(position).toString();
        switch(position){
        case OPTION_ONE:                getFragmentManager().beginTransaction().replace(R.id.activity_container, new OptionOneFragment()).commit();
            break;
        case RESISTOR_VALUE:
            getFragmentManager().beginTransaction().replace(R.id.activity_container, new OptionTwoFragment()).commit();
            break;
        default:
            Toast.makeText(getActivity(), getListView().getItemAtPosition(position).toString(), Toast.LENGTH_LONG).show();
            break;
        }       
        super.onListItemClick(l, v, position, id);
    }

这样,应用程序的每个组件都有自己的片段,由不同的类处理。

于 2013-03-08T23:28:20.370 回答
0

你在正确的轨道上。在小屏幕上,单击列表项会启动 DetailActivity,它是 DetailFragment 的简单包装器。在更大的屏幕上,单击列表项会将右侧替换为 DetailFragment 的新实例。

如果您使用 eclipse 和 ADT,我建议您查看 MasterDetailFlow 模板,可以通过创建新的 Android 项目或新的 Android Activity 来访问该模板。

于 2013-03-08T18:42:13.240 回答