2013-04-12 3 views
6

Так что недавно мне нужно было реализовать вкладки панели действий, которые поменяли бы текущий фрагмент на новый фрагмент. Несмотря на часы интенсивного поиска, я не смог найти четкое решение, поэтому я решил представить, как я решил проблему здесь. Два из фрагментов содержали просмотры списков, которые оказались основным осложняющим фактором.Реализация вкладок панели действий с фрагментами

ответ

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-файл фрагмента. Я покажу, как создать фрагмент с List View:

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)); 
} 
} 

Некоторые люди предполагают расширение ListFragment для фрагмента, который использует List View. Мой опыт был в том, что это больше проблем, чем того стоит.

Настройка файла 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); 
} 
} 

Я не знаю, если другие имели столько неприятностей, как я выполнение вкладок панели действий с фрагментами, но если они есть, я надеюсь, что это поможет. Любые предложения по лучшим реализациям будут высоко оценены.

+0

что делать, если у вас есть ошибка? AndroidRuntime (5485): java.lang.IllegalStateException: состояние сохранения отказа: активен, сброшен индекс: -1 – CaffeineShots

+1

. Тогда вы получите ошибку, и приложение закроет =) – Waclock

+0

Это лучшая реализация TabListener, чем то, что предлагает Google в гиды. – David

Смежные вопросы