Cambiando dinámicamente los fragmentos dentro de un host de fichas de fragmentos?
Tengo una actividad principal que es la actividad de fragmentos aquí estoy poniendo dos pestañas con dos fragmentos A y B en el fragmento B Tengo un botón cuando el usuario haga clic en el botón Quiero cambiar el fragmento B al fragmento C. Pero las pestañas anteriores Son visibles …
¿Cómo puedo lograr reemplazar fragmentos dentro de las pestañas?
- Reemplazar un fragmento a otro fragmento en el TabHost
- ¿Son la etiqueta y el icono mutuamente excluyentes en un tabHost TabSpec setIndicator?
- El contenido de Tabhost no se muestra cuando actualizo android.support.v4
- Cómo crear un cuadro de diálogo con pestañas con Android que contiene fragmentos?
- Cómo implementar pestañas personalizadas en Android como Instagram
Cualquier solución es muy apreciada.
- IllegalStateException en FragmentManager
- ¿Es posible llamar manualmente onCreateView en un fragmento?
- FragmentTabHost no crea vista dentro de Fragmento en android
- Fragmento superpuesto
- FindFragmentByTag - buscando fragmento en FragmentTabHost - always null
- Interfaz de Android
Concepto básico: podemos lograr esto creando un contenedor. Cada pestaña se asignará con un contenedor específico. Ahora cuando necesitamos un nuevo fragmento entonces lo reemplazaremos usando este contenedor.
Por favor, siga el código abajo mencionado paso a paso para tener una mejor comprensión. Paso 1: crear fichas para la aplicación. Diga "Home.java". Contendrá código para crear pestañas utilizando 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 programatically * 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
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/realtabcontent" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" /> <android.support.v4.app.FragmentTabHost android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="wrap_content" > <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dip" android:layout_height="0dip" android:layout_weight="0" /> </android.support.v4.app.FragmentTabHost> </LinearLayout>
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 aquí estoy considerando para un fragmento sólo la esperanza de que el resto puede ser manejado por usted de la misma manera. Definiendo el contenedor Clase de fragmento. Cada pestaña tendrá un contenedor específico. Diga 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 este id para reemplazar diferentes Fragmentos.
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container_framelayout" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout>
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<TalkModelAll> m_ArrayList = null; //ArrayList<String> stringArrayList = new ArrayList<String>(); TalkArrayAdapter taa; Set<String> uniqueValues = new HashSet<String>(); 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 radica en llamar a R.id. En lugar de R.layout. ¡Aclamaciones!