3

Я искал последние пару дней, чтобы найти решение этой проблемы: У меня есть одно действие, которое содержит макет вкладки и просмотр пейджера. Пейджер представления заполняется фрагментами с помощью адаптера. Вкладки создаются с помощью этого viewpager и фиксируются. Мой вопрос в том, как можно динамически изменять раскладку вкладок (например, после нажатия кнопки)?Динамически заменять фрагмент при использовании tablayout и viewpager в android

Это XML файл

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_height="match_parent" 
tools:context=".MainActivity" 
android:orientation="vertical"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark" /> 
    <android.support.design.widget.TabLayout 
     android:id="@+id/tablayout" 
     android:layout_width="match_parent" 
     android:layout_height="65dp" 
     android:background="@color/white" 
     app:tabMode="fixed" 
     app:tabGravity="fill" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark" /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"/> 
</LinearLayout> 

Это активность:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    setupToolbar(); 

    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tablayout); 
    setupTabLayout(tabLayout); 
} 

private void setupToolbar(){ 
    ... 
} 


public void setupViewPager(ViewPager viewPager) { 
    pageAdapter = new FragmentPageAdapter(getApplicationContext(), getSupportFragmentManager()); 
    pageAdapter.addFragment(ContentFragment.newInstance(), "Following", R.drawable.following); 
    pageAdapter.addFragment(ContentFragment.newInstance(), "Discover", R.drawable.flower); 
    pageAdapter.addFragment(ContentFragment.newInstance(), "", R.drawable.camera); 
    pageAdapter.addFragment(ProfileFragment.newInstance(), "Profile", R.drawable.profile); 
    pageAdapter.addFragment(ContentFragment.newInstance(), "Task List", R.drawable.list); 
    viewPager.setAdapter(pageAdapter); 
} 

public void setupTabLayout(TabLayout tabLayout) { 
    try { 
     tabLayout.setupWithViewPager(viewPager); 
     for (int i = 0; i < tabLayout.getTabCount(); i++) { 
      TabLayout.Tab tab = tabLayout.getTabAt(i); 
      tab.setCustomView(pageAdapter.getTabView(i)); 
     } 
     tabLayout.requestFocus(); 
    } 
    catch(Exception ex){ 
     Log.e("errr2", ex.getMessage()); 
    } 
} 

Это адаптер:

public class FragmentPageAdapter extends FragmentStatePagerAdapter { 
    private Context mContext; 
private List<Fragment> mFragments = new ArrayList<>(); 
private List<String> mFragmentTitles = new ArrayList<>(); 
private List<Integer> mFragmentIcons = new ArrayList<>(); 

public FragmentPageAdapter(Context context, FragmentManager fm) { 
    super(fm); 
    this.mContext = context; 
} 

public void addFragment(Fragment fragment, String title, int drawable) { 
    mFragments.add(fragment); 
    mFragmentTitles.add(title); 
    mFragmentIcons.add(drawable); 
} 



@Override 
public Fragment getItem(int position) { 

    return mFragments.get(position); 
} 


@Override 
public int getItemPosition(Object object) 
{ 
    return POSITION_UNCHANGED; 
} 

@Override 
public int getCount() { 
    return mFragments.size(); 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    return mFragmentTitles.get(position); 
} 

public View getTabView(int position) { 
    View tab = LayoutInflater.from(mContext).inflate(R.layout.tabbar_view, null); 
    TextView tabText = (TextView) tab.findViewById(R.id.tabText); 
    ImageView tabImage = (ImageView) tab.findViewById(R.id.tabImage); 
    tabText.setText(mFragmentTitles.get(position)); 
    tabImage.setBackgroundResource(mFragmentIcons.get(position)); 
    if (position == 3) { 
     tab.setSelected(true); 
    } 
    return tab; 
} 

}

Обычный способ заменить фрагмент является вызовом

fragmentManager.beginTransaction().replace(placeholderId, editPrifileFragment).commit(); 

, но что я должен использовать для placeholderId в этом случае? потому что в макете активности у меня нет заполнитель для фрагментов, просто просмотрщик. Итак, как я могу заменить фрагмент динамически, а также сохранить функциональность кнопки «Назад»? Я много искал и нашел некоторые хакерские решения, но я думаю, что это очень распространенная ситуация и должно иметь лучшее решение. спасибо.

+0

У вас есть решение проблемы? Я провел неделю, пробовав все безрезультатно. Заранее спасибо. –

ответ

0

Ваш ViewPagerFragment должен содержать placeholderId. Итак, в вашем Fragment (который является частью ViewPager), вы можете позвонить getChildFragmentManager(), чтобы добавить Fragment, как вы обычно это делаете.

childFragmentManager.beginTransaction().add(placeholderId, editPrifileFragment).addToBackStack(null).commit(); 
+0

спасибо за ответ, но когда я попробовал, он не сработал. Я также попытался удалить фрагмент, а затем добавить новый фрагмент, используя этот код: fragmentTransaction.remove (ProfileFragment.this) .addToBackStack (null) .commit(); который работает и удаляет фрагмент, но добавление нового фрагмента не работает: fragmentTransaction.add (R.id.layout, editPrifileFragment, «df»). addToBackStack (null) .commit(); почему это? –

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