41

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

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

Любое решение приветствуется.

ответ

92

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

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

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

<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> 

Шаг 2: Определить базовый фрагмент контейнера, который будет полезен для возвратов и Replacment фрагментов "проверить replaceFragement()". Наш класс «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: Теперь здесь я рассматриваю для одного фрагмента только в надежде, что остальные могут быть обработаны вами таким же образом. Определение класса Фрагмент контейнера. Каждая вкладка будет иметь конкретный контейнер. Say 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 для замены разных фрагментов.

<?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> 

Ваш основной класс. «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; 
     } 
    } 

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

+5

отличная работа .. действительно, вы хакер .. это то, что я ищу. +1 с благодарностью. –

+0

Его работа отлично для без карт. Но как использовать карты здесь. Если я использую фрагмент BaseContainer, это дает мне nullPointerException. onClick of a button, переадресовывая его в фрагмент, где мне нужно отображать карту. Пожалуйста, помогите мне – user2199280

+0

@ user2199280 .. Вам просто нужно определить карту frgament в своем макете. :) .. Также не забудьте указать ключ google и другие учетные данные в вашем файле манифеста. – AndroidHacker

 Смежные вопросы

  • Нет связанных вопросов^_^