そのため、最近、現在のフラグメントを新しいフラグメントと交換するアクション バー タブを実装する必要がありました。何時間も集中的に検索したにもかかわらず、明確な解決策を見つけることができなかったので、ここで問題をどのように解決したかを紹介したいと思いました. フラグメントのうちの 2 つにはリスト ビューが含まれており、これが問題を複雑にする主な要因であることが判明しました。
13215 次
1 に答える
15
最初に、フラグメントをアタッチするアクティビティを作成します。そのアクティビティの XML ファイルに、次のような線形レイアウトを追加します。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".WoodenSideProject" >
<LinearLayout
android:id="@+id/fragment_placeholder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
XML ファイルには他に何も追加しないでください。Eclipse がプリロードされているタブ ホストでさえありません。
次にフラグメントを作成します。最初に、フラグメントの XML ファイルを使用して、必要に応じてフラグメントの UI を構築します。リスト ビューでフラグメントを作成する方法を示します。
public class Fragment1Name extends Fragment
{
public static String TAG="DirectionsFragment";
private String[] list_items = {"Put the list of Strings you want here"};
ListView lView1;
/*@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, list_items);
setListAdapter(adapter);
}*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_XML_title, container, false);
createListView(view);
// Inflate the layout for this fragment
return view;
}
private void createListView(View view)
{
lView1 = (ListView) view.findViewById(R.id.ListViewID);
//Set option as Multiple Choice. So that user can able to select more the one option from list
lView1.setAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, list_items));
}
}
List View を使用するフラグメントの ListFragment を拡張することを提案する人もいます。私の経験では、それは価値があるよりも面倒です。
アクティビティの Java ファイルを次のように設定します。
public class ActivityName extends FragmentActivity {
public static Context appContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_project);
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
setTitle("WoodenSideProject");
ActionBar.Tab tab1 = actionBar.newTab().setText("Tab1");
ActionBar.Tab tab2 = actionBar.newTab().setText("Tab2");
ActionBar.Tab tab3 = actionBar.newTab().setText("Tab3");
Fragment Fragment1Name = new Fragment1Name();
Fragment Fragment2Name = new Fragment2Name();
Fragment Fragment3Name = new Fragment3Name();
tab1.setTabListener(new MyTabsListener(Fragment1Name));
tab2.setTabListener(new MyTabsListener(Fragment2Name));
tab3.setTabListener(new MyTabsListener(Fragment3Name));
actionBar.addTab(tab1);
actionBar.addTab(tab2);
actionBar.addTab(tab3);
}
同じアクティビティ内に次のクラスを作成します。
class MyTabsListener implements ActionBar.TabListener {
public Fragment fragment;
public MyTabsListener(Fragment fragment) {
this.fragment = fragment;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
//do what you want when tab is reselected, I do nothing
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
ft.replace(R.id.fragment_placeholder, fragment);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft.remove(fragment);
}
}
フラグメントを使用してアクション バー タブを実装するのと同じくらい多くの問題を抱えている人がいるかどうかはわかりませんが、そうであれば、これが役立つことを願っています。より良い実装のための提案は大歓迎です。
于 2013-04-12T14:34:04.057 に答える