2015-03-24 2 views
0

Я работаю над FragmentTabHost с Fragment. Мой FragmentTabHost имеет 4 разных fragments, но когда я меняю вкладки, то после некоторых изменений 2 или 3 вкладки имеют одинаковый фрагмент. Подобно index0 index1 index3 имеет параметр SettingFragment. Но у них разные fragment. Это мой код для вкладок настройки в MainActivityFragment, которая проходит FragmentActivityфрагмент Повторите в tabhost при смене вкладки

private void setTabs() { 
    mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
    mTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent); 



// TabHost.TabSpec spec; 
    //Intent intent; 

    mTabHost.addTab(
       mTabHost.newTabSpec("tab1").setIndicator(null, getResources().getDrawable(R.drawable.icon_alert_tab)), 
       AlertFragment.class, null); 
     mTabHost.addTab(
       mTabHost.newTabSpec("tab2").setIndicator(null, getResources().getDrawable(R.drawable.icon_wlmuser_tab)), 
       UserFragment.class, null); 
     mTabHost.addTab(
       mTabHost.newTabSpec("tab3").setIndicator(null, getResources().getDrawable(R.drawable.icon_chat_tab)), 
       ChatFragment.class, null); 
     mTabHost.addTab(
       mTabHost.newTabSpec("tab4").setIndicator(null, getResources().getDrawable(R.drawable.icon_setting_tab)), 
       SettingFragment.class, null); 

     mTabHost.getTabWidget().setStripEnabled(false); 
     mTabHost.setCurrentTab(1); 
    } 

моих 4 фрагментов AlertFragment, UserFragment, ChatFragment, SettingFragment и они есть кнопки. На нажатием на кнопки еще фрагменты открытых по FragmentTransaction

LIKE в UserFragment я называю ContectFragment в FrameLayout по inviteBtn кнопки

inviteBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      // replace with contact fragment 
      fragment = new ContactFragment(); 

      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left); 
      ft.replace(android.R.id.tabcontent, fragment); 
      ft.addToBackStack(null); 
      // Start the animated transition. 
      ft.commit(); 
     } 
    }); 

. Проблема возникает, когда я открываю внутри fragments.

+0

Пожалуйста, измените свой вопрос правильный путь, дайте мне знать в UserFragment внутри вкладки хоста, который вы хотите заменить фрагмент в одной и той же деятельности. что вы действительно хотите сделать, вы можете правильно объяснить. –

+0

@BhavdipPathar мой «FragmentTabHost» имеет 4 разных фрагмента .. но после смены вкладок .. 3 вкладки имеют один и тот же фрагмент –

+0

. Тогда что означает, что каждый фрагмент имеет кнопку и нажимает на нее, вы хотите загрузить другой фрагмент, вы столкнулись с когда вы пытались заменить фрагмент внутри фрагмента. –

ответ

1

Привет, я исправил вас, см. Ниже решение. В идеале вам нужно создать один дополнительный BaseContainerFragment. У этого есть framelayout. Затем создайте фрагмент контейнера для каждого из четырех статических фрагментов. допустим, у меня есть два фрагмента с соответствующим фрагментом контейнера. см. ниже код.

Оригинальный фрагмент:

  1. AlertFragment.java
  2. ChatFragment.java

BaseContainerFragment.java

общественного класса BaseContainerFragment расширяет фрагмент {

public BaseContainerFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    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() { 
     boolean isPop = false; 
     if (getChildFragmentManager().getBackStackEntryCount() > 0) { 
      isPop = true; 
      getChildFragmentManager().popBackStack(); 
     } 
     return isPop; 
    } 

} 

Контейнер Фрагмент, который расширяет над BaseContainerFragment:

  1. AlertContainerFragment.java расширяет BaseContainerFragment.java
  2. ChatContainerFragment.java расширяет BaseContainerFragment.java

Теперь в вашем FragmentActivity вы необходимо добавить ContainerFragment каждого фрагмента внутри FragmentTabHost.see ниже код.

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentTabHost; 
import android.view.Menu; 
import android.view.MenuItem; 


public class TestSukhwantTabHost extends FragmentActivity { 

    private FragmentTabHost mTabHost; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test_sukhwant_tab_host); 
     mTabHost = (FragmentTabHost) findViewById(R.id.tabhost); 
     mTabHost.setup(this, getSupportFragmentManager(), R.id.tabFrameLayout); 

     mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator(null, getResources().getDrawable(R.drawable.ic_launcher)),AlertContainerFragment.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator(null, getResources().getDrawable(R.drawable.ic_launcher)),ChatContainerFragment.class, null); 
     mTabHost.getTabWidget().setStripEnabled(false); 
     mTabHost.setCurrentTab(0); 
    } 
} 

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

fragment_base_container.xml

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

AlertContainerFragment.Java

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 


public class AlertContainerFragment extends BaseContainerFragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_base_container, container, false); 
    } 


    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     initView(); 
    } 

    private void initView() { 
     replaceFragment(new AlertFragment(), false); 
    } 
} 

ChatContainerFragment.java

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 


public class ChatContainerFragment extends BaseContainerFragment { 


    public ChatContainerFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_base_container, container, false); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     initView(); 
    } 

    private void initView() { 
     replaceFragment(new ChatFragment(), false); 
    } 
} 

Оригинальный фрагмент:

Ниже AlertFragment.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 


public class AlertFragment extends Fragment { 

    private Button framgnet1_button; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View mView = inflater.inflate(R.layout.fragment_alert, container, false); 
     framgnet1_button = (Button) mView.findViewById(R.id.framgnet1_button); 
     framgnet1_button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ((BaseContainerFragment)getParentFragment()).replaceFragment(new DynamicAlertFramgnet(), false); 
      } 
     }); 
     return mView; 
    } 
} 

ChatFragment.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 


public class ChatFragment extends Fragment { 

    private Button button_chart_fragment; 

    public ChatFragment() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View mView = inflater.inflate(R.layout.fragment_chat, container, false); 
     button_chart_fragment = (Button)mView.findViewById(R.id.button_chart_fragment); 
     button_chart_fragment.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ((BaseContainerFragment)getParentFragment()).replaceFragment(new DynamicChartFramgnet(), false); 
      } 
     }); 
     return mView; 
    } 
} 

В коде выше, что я был реализован, каждый оригинальный фрагмент имеет кнопку при нажатии на нее, она будет загружать новый фрагмент.

Дайте мне знать, если у вас есть вопросы &, просьба сообщить свое предложение.

Спасибо

+0

getSupportFragmentManager() дает ошибку компилятора неопределенного метода для onClick, поэтому я меняю его на getFragmentManager bt then same problem –

+0

В вашем опубликованном коде я вижу mTabHost.setup (это, getSupportFragmentManager(), android.R.id.tabcontent); –

+0

это в FragmentActivity, но кнопки в виде фрагментов –

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