¿Cambia dinámicamente los fragmentos dentro de un host de tabs de fragmentos?

Tengo una actividad principal que es actividad de fragmentos aquí. Estoy configurando dos tabs con dos fragmentos A y B en el fragmento B. Tengo un botón cuando el usuario hace clic en el botón Quiero cambiar el fragmento B al fragmento C. Pero las tabs de arriba son visibles …

¿Cómo puedo lograr reemplazar fragmentos dentro de tabs?

Cualquier solución es muy apreciada.

Concepto básico: podemos lograrlo creando un contenedor. Cada pestaña se asignará con un contenedor específico. Ahora cuando necesitamos un nuevo fragmento, lo reemplazaremos utilizando este contenedor.

Siga amablemente el código mencionado paso a paso para tener una mejor comprensión. Paso-1: Crea tabs para tu aplicación. Diga “Home.java”. Contendrá código para crear tabs usando fragmento.

import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTabHost; import android.widget.TextView; import app.drugs.talksooner.container.GoContainerFragment; import app.drugs.talksooner.container.LearnContainerFragment; import app.drugs.talksooner.container.MoreContainerFragment; import app.drugs.talksooner.container.TalkContainerFragment; import app.drugs.talksooner.container.WatchContainerFragment; import app.drugs.talksooner.utils.BaseContainerFragment; public class Home extends FragmentActivity { private static final String TAB_1_TAG = "tab_1"; private static final String TAB_2_TAG = "tab_2"; private static final String TAB_3_TAG = "tab_3"; private static final String TAB_4_TAG = "tab_4"; private static final String TAB_5_TAG = "tab_5"; private FragmentTabHost mTabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home); initView(); } private void initView() { mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); // mTabHost.addTab(mTabHost.newTabSpec(TAB_1_TAG).setIndicator("Talk", getResources().getDrawable(R.drawable.ic_launcher)), TalkContainerFragment.class, null); mTabHost.addTab(mTabHost.newTabSpec(TAB_1_TAG).setIndicator("Talk"), TalkContainerFragment.class, null); mTabHost.addTab(mTabHost.newTabSpec(TAB_2_TAG).setIndicator("Learn"), LearnContainerFragment.class, null); mTabHost.addTab(mTabHost.newTabSpec(TAB_3_TAG).setIndicator("Go"), GoContainerFragment.class, null); mTabHost.addTab(mTabHost.newTabSpec(TAB_4_TAG).setIndicator("Watch"), WatchContainerFragment.class, null); mTabHost.addTab(mTabHost.newTabSpec(TAB_5_TAG).setIndicator("More"), MoreContainerFragment.class, null); /* Increase tab height progtwigtically * tabs.getTabWidget().getChildAt(1).getLayoutParams().height = 150; */ for (int i = 0; i < mTabHost.getTabWidget().getChildCount(); i++) { final TextView tv = (TextView) mTabHost.getTabWidget().getChildAt(i).findViewById(android.R.id.title); if (tv == null) continue; else tv.setTextSize(10); } } @Override public void onBackPressed() { boolean isPopFragment = false; String currentTabTag = mTabHost.getCurrentTabTag(); if (currentTabTag.equals(TAB_1_TAG)) { isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_1_TAG)).popFragment(); } else if (currentTabTag.equals(TAB_2_TAG)) { isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_2_TAG)).popFragment(); } else if (currentTabTag.equals(TAB_3_TAG)) { isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_3_TAG)).popFragment(); } else if (currentTabTag.equals(TAB_4_TAG)) { isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_4_TAG)).popFragment(); } else if (currentTabTag.equals(TAB_5_TAG)) { isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_5_TAG)).popFragment(); } if (!isPopFragment) { finish(); } } } 

Su archivo home.xml

        

Paso 2: defina el fragmento del contenedor base que será útil para retroceder y reemplazar los fragmentos "check out replaceFragement ()". Nuestra clase "BaseContainerFragment.java"

  import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.util.Log; import app.drugs.talksooner.R; public class BaseContainerFragment extends Fragment { public void replaceFragment(Fragment fragment, boolean addToBackStack) { FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); if (addToBackStack) { transaction.addToBackStack(null); } transaction.replace(R.id.container_framelayout, fragment); transaction.commit(); getChildFragmentManager().executePendingTransactions(); } public boolean popFragment() { Log.e("test", "pop fragment: " + getChildFragmentManager().getBackStackEntryCount()); boolean isPop = false; if (getChildFragmentManager().getBackStackEntryCount() > 0) { isPop = true; getChildFragmentManager().popBackStack(); } return isPop; } } 

Paso 3: ahora estoy considerando un fragmento esperando que el rest pueda ser manejado de la misma manera. Definición de contenedor Fragmento de clase. Cada pestaña tendrá un contenedor específico. Di TalkContainerFragment.java para la primera pestaña

  import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import app.drugs.talksooner.R; import app.drugs.talksooner.Talk; import app.drugs.talksooner.utils.BaseContainerFragment; public class TalkContainerFragment extends BaseContainerFragment { private boolean mIsViewInited; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.e("test", "tab 1 oncreateview"); return inflater.inflate(R.layout.container_fragment, null); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.e("test", "tab 1 container on activity created"); if (!mIsViewInited) { mIsViewInited = true; initView(); } } private void initView() { Log.e("test", "tab 1 init view"); replaceFragment(new Talk(), false); } } 

Es un archivo xml. "container_fragment.xml" este contenedor xml contiene frameLayout. Usaremos esta identificación para reemplazar diferentes Fragmentos.

     

Tu clase principal "Talk.java"

  public class Talk extends Fragment { /** Define global variables over here */ //private ProgressDialog pDialog; StaticApiList sal; TalkModelAll tma; JSONObject myJasonObject = null; private ListView lv; private ArrayList m_ArrayList = null; //ArrayList stringArrayList = new ArrayList(); TalkArrayAdapter taa; Set uniqueValues = new HashSet(); TextView rowTextView = null; boolean vivek = false; int postid; String title; String thumsrc; String largeimg; String excert; String description; String cat; String myUrl; String jsonString; int mCurCheckPosition; String check_state = null; String ccc; LinearLayout myLinearLayout; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.talk, container, false); Button btn = (Button) rootView.findViewById(R.id.your_btn_id); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //Here TalkDetail is name of class that needs to open TalkDetail fragment = new TalkDetail(); // if U need to pass some data Bundle bundle = new Bundle(); bundle.putString("title", m_ArrayList.get(arg2).title); bundle.putString("largeimg", m_ArrayList.get(arg2).largeimg); bundle.putString("excert", m_ArrayList.get(arg2).excert); bundle.putString("description", m_ArrayList.get(arg2).description); bundle.putString("cat", m_ArrayList.get(arg2).cat); //bundle.putInt("postid", m_ArrayList.get(arg2).postid); fragment.setArguments(bundle); ((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true); } }); return rootView; } } 

Eso es. Tú eres bueno para irte. Toda la magia está en llamar a R.id. en lugar de R.layout. ¡Aclamaciones!