Динамическое изменение fragmentов внутри узла вкладки fragmentов?

У меня есть одно основное действие, которое является активностью fragmentа здесь. Я устанавливаю две вкладки с двумя fragmentами A и B в fragmentе B. У меня есть одна кнопка, когда пользователь нажимает кнопку, я хочу сменить fragment B на fragment C. Но вкладки выше видны …

Как я могу добиться замены fragmentов внутри вкладок?

Любое решение очень ценится.

Основная концепция. Мы можем достичь этого, создав контейнер. Каждая вкладка будет назначена конкретным контейнером. Теперь, когда нам нужен новый fragment, мы заменим его с помощью этого контейнера.

Пожалуйста, следуйте нижеприведенному коду шаг за шагом, чтобы лучше понять. Шаг 1. Создайте вкладки для своего приложения. Скажите «Home.java». Он будет содержать код для создания вкладок с использованием fragmentа.

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

Ваш файл home.xml

        

Шаг 2: Определите fragment базового контейнера, который будет полезен для обратного отслеживания и замены fragmentов «check replaceFragement ()». Наш class «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; } } 

Шаг 3: Теперь я рассматриваю один fragment, только надеясь, что rest может быть обработан вами таким же образом. Определение classа Фрагмент контейнера. Каждая вкладка будет иметь конкретный контейнер. Скажите TalkContainerFragment.java для первой вкладки

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

Это xml-файл. "container_fragment.xml" этот контейнер xml содержит frameLayout. мы будем использовать этот id для замены разных fragmentов.

     

Ваш основной class. "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; } } 

Вот и все. Тебе хорошо идти. Вся магия заключается в вызове Р. вместо R.layout. Ура!

  • Анимация fragmentации: слайд и слайд
  • Отправка данных из вложенных fragmentов в родительский fragment
  • Активность, AppCompatActivity, FragmentActivity и ActionBarActivity: когда использовать что?
  • Android. Фрагмент getActivity () иногда возвращает null
  • Обновление данных в ListFragment как часть ViewPager
  • getActivity () возвращает значение null в функции Фрагмент
  • Проблема ViewPager + RecyclerView в android
  • Меню Android Options в fragmentе
  • Как реализовать onBackPressed () & intents в fragmentе?
  • Фрагменты onResume из заднего стека
  • Разница и использование onCreate (), onCreateView () и onActivityCreated () в fragmentах
  • Давайте будем гением компьютера.