2014-03-30 128 views
1

我在使用帶有滑動視圖的選項卡的主要活動中使用了Eclipse模板。總共有5個選項卡,每個選項卡將託管應用程序的一部分。我開始使用標籤爲「人員」的選項卡開始實施。當用戶首先選擇人員選項卡時,他們將得到一個ListView人員列表。當用戶從列表中選擇一個人時,我想在舊的(如開始一個新的活動)之上創建一個新的片段,但在同一個選項卡中。當用戶導航到新選項卡,然後返回詳細視圖應該仍然存在。當詳細視圖關閉時,人員列表應該恢復。如何在ActionBar選項卡中添加片段?

如何在單個選項卡中創建新的片段並保留整個選項卡的狀態?

MainActivity.java

import android.app.ActionBar; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.Menu; 
import android.view.MenuItem; 

import java.util.Locale; 

public class MainActivity extends FragmentActivity implements ActionBar.TabListener, 
     UnitsFragment.OnUnitSelectedListener { 

    /** 
    * A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
    * one of the sections/tabs/pages. 
    */ 
    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public int getCount() { 
      // Show 5 total pages. 
      return 5; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      // getItem is called to instantiate the fragment for the given page. 
      switch (position) { 
       case 0: 
        return new AccountabilityFragment(); 
       case 1: 
        return new EventsFragment(); 
       case 2: 
        return new MeFragment(); 
       case 3: 
        return new PersonnelFragment(); 
       case 4: 
        return new UnitsFragment(); 
      } 
      return null; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      Locale l = Locale.getDefault(); 
      switch (position) { 
       case 0: 
        return getString(R.string.title_section1).toUpperCase(l); 
       case 1: 
        return getString(R.string.title_section2).toUpperCase(l); 
       case 2: 
        return getString(R.string.title_section3).toUpperCase(l); 
       case 3: 
        return getString(R.string.title_section4).toUpperCase(l); 
       case 4: 
        return getString(R.string.title_section5).toUpperCase(l); 
      } 
      return null; 
     } 
    } 

    /** 
    * The {@link android.support.v4.view.PagerAdapter} that will provide 
    * fragments for each of the sections. We use a 
    * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which 
    * will keep every loaded fragment in memory. If this becomes too memory 
    * intensive, it may be best to switch to a 
    * {@link android.support.v4.app.FragmentStatePagerAdapter}. 
    */ 
    SectionsPagerAdapter mSectionsPagerAdapter; 
    static boolean mShowMenuAdd = true; 
    static boolean mShowMenuSearch = true; 

    /** 
    * The {@link ViewPager} that will host the section contents. 
    */ 
    ViewPager mViewPager; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_add: 
       return true; 
      case R.id.action_search: 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     menu.findItem(R.id.action_add).setVisible(mShowMenuAdd); 
     menu.findItem(R.id.action_search).setVisible(mShowMenuSearch); 
     return true; 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, switch to the corresponding page in 
     // the ViewPager. 
     mShowMenuAdd = setMenuAddVisible(tab.getPosition()); 
     mShowMenuSearch = setMenuSearchVisible(tab.getPosition()); 
     invalidateOptionsMenu(); 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Set up the action bar. 
     final ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Create the adapter that will return a fragment for each of the five 
     // primary sections of the app. 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

     // Set up the ViewPager with the sections adapter. 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     // When swiping between different sections, select the corresponding 
     // tab. We can also use ActionBar.Tab#select() to do this if we have 
     // a reference to the Tab. 
     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

     // For each of the sections in the app, add a tab to the action bar. 
     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      actionBar.addTab(
        actionBar.newTab() 
          .setText(mSectionsPagerAdapter.getPageTitle(i)) 
          .setTabListener(this)); 
     } 

    } 

    private boolean setMenuAddVisible(int tab) { 
     switch (tab) { 
      case 0: 
       return false; 
      case 1: 
       return false; 
      case 2: 
       return false; 
      case 3: 
       return false; 
      case 4: 
       return true; 
     } 
     return false; 
    } 

    private boolean setMenuSearchVisible(int tab) { 
     switch (tab) { 
      case 0: 
       return false; 
      case 1: 
       return false; 
      case 2: 
       return false; 
      case 3: 
       return false; 
      case 4: 
       return true; 
     } 
     return false; 
    } 
} 

PersonnelFragment.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class PersonnelFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_personnel, container, false); 
     TextView dummyTextView = (TextView) rootView.findViewById(R.id.textUnitsHeader); 
     dummyTextView.setText("Personnel Layout Placeholder"); 
     return rootView; 
    } 
} 

回答

0

我添加一個新的佈局,以充當根視圖和單個標籤中託管片段的堆疊。 我偶然發現了視頻,演示了我正在尋找並實施它的行爲。

非常感謝GitHub用戶Dani Lao他的source code

我的實現:

activity_main.xml中

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" /> 

MainActivity.java

... 

public class MainActivity extends FragmentActivity { 

    SectionsPagerAdapter mSectionsPagerAdapter; 
    ViewPager mViewPager; 
    ... 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_add: 
       android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager() 
         .beginTransaction(); 
       ft.replace(R.id.personnel_root, new PersonnelViewFragment()); 
       ft.setTransition(android.support.v4.app.FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       ft.addToBackStack(null); 
       ft.commit(); 
       return true; 
      case R.id.action_search: 
       ft = getSupportFragmentManager() 
         .beginTransaction(); 
       ft.replace(R.id.personnel_root, new PersonnelListFragment()); 
       ft.setTransition(android.support.v4.app.FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       ft.addToBackStack(null); 
       ft.commit(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 
    ... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     mSectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager()); 

     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 
     ActionBar.TabListener actionBarTabListener = new ActionBar.TabListener() { 

      @Override 
      public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      } 

      @Override 
      public void onTabSelected(Tab tab, FragmentTransaction ft) { 
       mViewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabReselected(Tab tab, FragmentTransaction ft) { 
      } 
     }; 
     // For each of the sections in the app, add a tab to the action bar. 
     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      actionBar.addTab(
        actionBar.newTab() 
          .setText(mSectionsPagerAdapter.getPageTitle(i)) 
          .setTabListener(actionBarTabListener)); 
     } 
    } 
} 

fragment_personnel_root.xml(新)

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/personnel_root" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

</FrameLayout> 

PersonnelRootFragment.java(新)

public class PersonnelRootFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_personnel_root, container, false); 

     FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager() 
       .beginTransaction(); 
     fragmentTransaction.replace(R.id.personnel_root, new PersonnelListFragment()); 
     fragmentTransaction.commit(); 
     return rootView; 
    } 
} 

fragment_personnel_list.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".MainActivity" > 

    <TextView 
     android:id="@+id/textPersonnelHeader" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/text_all_personnel" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@color/mc_med_brown" /> 

    <EditText 
     android:id="@+id/editTextPersonnelSearch" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:hint="@string/search_hint" > 

     <requestFocus /> 
    </EditText> 

    <ListView 
     android:id="@+id/listViewPersonnel" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textFilterEnabled="true" > 
    </ListView> 

</LinearLayout> 
相關問題