Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>There is no "standard" way of going about this, because this design style is discouraged. However, I found a way to make it work: You will design your navigation manually.</p> <p>Your application should have one Activity, a FragmentActivity. It has a FragmentTabHost that will hold each of your TabFragments. </p> <p>TabFragment is the abstract class I created to represent your tab in the TabSpec. It will manage the navigation and swapping of fragments WITHIN the tab. </p> <p>Then, the individual Fragments you create can be swapped within the TabFragment object. Here is the code:</p> <p><strong>The Activity</strong></p> <pre><code> public class MainActivity extends FragmentActivity { private FragmentTabHost tabHost; //(TabFragment)s will set this property when created so the Activity can communicate with it public TabFragment activeFragment; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //create tabHost based on .xml layout tabHost = (FragmentTabHost)findViewById(R.id.tabhost); tabHost.setup(this, getSupportFragmentManager(), R.id.tabcontent); //add each of your tabs to the tabHost. These are all (TabFragment)s tabHost.addTab(tabHost.newTabSpec("New Tab").setIndicator("New Tab"), ExampleTabFragment.class, null); } /*override the onBackPressed method, so that your application does not close every time the user navigates back. Instead, calls the activeFragment to determine behavior*/ @Override public void onBackPressed() { activeFragment.onBackPressed(); } //method for TabFragment to call when the user navigates out of the app public void close(){ super.onBackPressed(); } } </code></pre> <p><strong>TabFragment</strong></p> <pre><code> public abstract class TabFragment extends Fragment { @Override public void onResume(){ //sets the property in the Activity so we can reference this from it. ((MainActivity) getActivity()).activeFragment=this; super.onResume(); } //this will be the method called when the back button is pressed. It will navigate. public abstract void onBackPressed(); } </code></pre> <p><strong>Instance of TabFragment</strong> Inside an instance of a TabFragment should be a FrameLayout to which child Fragments can be attached. The first time the tab is clicked, it will launch the Fragment specified in <code>onCreate()</code>. After switching back to it from another tab, it will resume whatever Fragment was last displayed. The onBackPressed() method should be used to navigate back through the fragments if hierarchical navigation is desired. I used a byte property (<code>tabContentIndex</code>) to determine how to navigate. The Fragments can swap themselves for other Fragments if you add a constructor that takes and instance of this TabFragment. They will do this by accessing the <code>start(Example)Fragment()</code> methods. Remember that the 'back' button must eventually exit the app.</p> <pre><code>public class NewTrailTabContent extends TabFragment { //to determine what child Fragment is active byte tabContentIndex; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //a simple FrameLayout in this case. Child Fragments will be attached. return inflater.inflate(R.layout.example_fragment, container, false); } @Override public void onCreate(Bundle savedInstanceState) { //The tab starts with this Fragment startDiologFragment(); super.onCreate(savedInstanceState); } public void startExampleFragment(){ /*Fragment's constructor allows us to reference the parent to navigate. In effect, this Fragment will be able to call these navigation methods.*/ ExampleFragment newFragment = new ExampleFragment(this); FragmentManager fragmentManager = getChildFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); //this Resource is the FrameLayout fragmentTransaction.replace(R.id.example_contentpane, newFragment); fragmentTransaction.commit(); //this is set so the onBackPressed() method knows how to operate. tabContentIndex =0; } public void startTestFragment(){ Fragment testFragment = new TestFragment(this); FragmentManager fragmentManager = getChildFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); fragmentTransaction.replace(R.id.example_contentpane, testFragment); fragmentTransaction.commit(); //different contentIndex tabContentIndex = 1; } //this method called by the Activity @Override public void onBackPressed() { //this will close the app because we are at the top of the hierarchy if(tabContentIndex==0){ ((MainActivity)getActivity()).close(); //this will switch to the original content fragment. }else if(tabContentIndex==1||tabContentIndex==2){ startExampleFragment(); } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload