我打算将现有的Android应用程序转换为片段布局。
我们的想法是拥有经典的两个面板布局(左侧是项目列表,右侧是详细信息)。
实际上,该应用程序由4个活动组成:
现在我开始进行转换,我创建了一个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);
}
}
该片段将位于面板的左侧。
我的问题是为了正确的一面。这个想法是,对于列表的每个元素,将显示相应的活动(或片段?)。
那么正确的方法是什么?
当用户选择项目时,最好在正确的片段中启动活动吗?
或者我必须以编程方式在片段之间切换?以及如何做到这一点(我找到了许多教程,但他们总是使用相同的活动来改变其中的一些数据)?
我为正确的片段创建了以下类(但我不确定我是否正确地执行了此操作):
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>
答案 0 :(得分: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);
}
这样,应用程序的每个组件都有自己的片段,由不同的类处理。
答案 1 :(得分:0)
你走在正确的轨道上。在小屏幕上,单击列表项会启动DetailActivity,它是DetailFragment的简单包装器。在更大的屏幕上,单击列表项将使用新的DetailFragment实例替换右侧。
如果您正在使用eclipse和ADT,我建议您查看MasterDetailFlow模板,可以通过创建新的Android项目或新的Android Activity来访问该模板。