Vì vậy, gần đây tôi cần triển khai các tab thanh tác vụ có thể hoán đổi đoạn hiện tại với một đoạn mới. Mặc dù hàng giờ tìm kiếm chuyên sâu tôi không thể tìm ra giải pháp rõ ràng, vì vậy tôi nghĩ tôi sẽ trình bày cách tôi giải quyết vấn đề ở đây. Hai trong số các mảnh có chứa các khung nhìn danh sách, hóa ra là một yếu tố phức tạp chính.Thực hiện các tab thanh hành động với các đoạn
Trả lời
Trước tiên hãy tạo Hoạt động mà bạn muốn đính kèm các đoạn. Trong tập tin XML cho hoạt động mà thêm một bố trí tuyến tính như sau:
<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>
Đừng thêm bất cứ điều gì khác để các tập tin XML. Thậm chí không phải là máy chủ lưu trữ tab được cài đặt sẵn với Eclipse.
Tiếp theo tạo các đoạn của bạn. Trước tiên, hãy xây dựng giao diện người dùng cho đoạn của bạn theo cách bạn muốn bằng cách sử dụng tệp XML của đoạn. Tôi sẽ chỉ cách tạo phân đoạn có Chế độ xem danh sách:
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));
}
}
Một số người khuyên bạn nên mở rộng ListFragment cho một đoạn sử dụng Chế độ xem danh sách. Kinh nghiệm của tôi đã được nhiều rắc rối hơn nó có giá trị.
Thiết lập tập tin java của Hoạt động như sau:
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);
}
Trong Hoạt động cùng tạo ra các lớp sau đây:
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);
}
}
Tôi không biết nếu những người khác đã có càng nhiều rắc rối như tôi triển khai các tab thanh hành động với các đoạn, nhưng nếu chúng tôi hy vọng điều này sẽ giúp ích. Bất kỳ đề xuất nào cho việc triển khai tốt hơn sẽ được đánh giá cao.
nếu bạn gặp lỗi như thế này thì sao? AndroidRuntime (5485): java.lang.IllegalStateException: Trạng thái không lưu: active đã xóa chỉ mục: -1 – CaffeineShots
Sau đó, bạn sẽ gặp lỗi và ứng dụng sẽ đóng =) – Waclock
Đây là cách triển khai tốt hơn của TabListener so với những gì Google cung cấp trong hướng dẫn. – David