2017-01-01 4 views
6

у меня в главной деятельности в навигационной панели действий с использованием вкладок с использованием фрагментов (с Material Design), как показано ниже, который работает хорошо, но теперь я хочу, чтобы Tab навигации в пределах моих фрагментов ...Фрагмент Вкладка внутри фрагмента

// Add Fragments to Tabs in Main Activity 
private void setupViewPager(ViewPager viewPager) { 
    Adapter adapter = new Adapter(getSupportFragmentManager()); 
    adapter.addFragment(new FeedsFragment(), "Latest Updates"); 
    adapter.addFragment(new ClubTeamsFragment(), "Club Teams"); 
    adapter.addFragment(new FixturesFragment(), "Fixtures"); 
    adapter.addFragment(new ResultsFragment(), "Results"); 
    adapter.addFragment(new ClubFieldsFragment(), "Club Fields"); 
    viewPager.setAdapter(adapter); 
} 

Я уверен, что TabHost теперь устарел.

Я хочу достичь прилагаемого изображения. Синие вкладки находятся на уровне основной активности, а вкладки «Серая дата» находятся в выбранном фрагменте.

enter image description here

Я прочитал несколько постов об использовании Tab хоста или Fragment активности, или же я использую активность, которая вытянута фрагмент?

+0

Ответ, похоже, работает промежуточный ...http://stackoverflow.com/a/27918056/1423608 – BENN1TH

+0

вы можете поделиться своим примером – Pallavi

+0

https://stackoverflow.com/a/41656303/1423608 – BENN1TH

ответ

24

Ниже ответ, что я достиг с помощью фрагментов вкладки внутри вкладки фрагментов, которые находятся в моем MainActivity

Внутри моего фрагмента, используя getChildFragmentManager()

public class FixturesTabs extends Fragment { 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fixtures_new_tabs,container, false); 
    // Setting ViewPager for each Tabs 
    ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 
    // Set Tabs inside Toolbar 
    TabLayout tabs = (TabLayout) view.findViewById(R.id.result_tabs); 
    tabs.setupWithViewPager(viewPager); 


    return view; 

} 


// Add Fragments to Tabs 
private void setupViewPager(ViewPager viewPager) { 


    Adapter adapter = new Adapter(getChildFragmentManager()); 
    adapter.addFragment(new TodaysFixturesFragment(), "Today"); 
    adapter.addFragment(new WeekFixturesFragment(), "Week"); 
    adapter.addFragment(new MonthFixturesFragment(), "Month"); 
    adapter.addFragment(new AllFixturesFragment(), "Month"); 
    adapter.addFragment(new MyTeamsFixturesFragment(), "My Teams"); 
    viewPager.setAdapter(adapter); 



} 

static class Adapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public Adapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

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

    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

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



} 

и мой XML с именем «fixtures_new_tabs.xml "в соответствии с раздутым макетом

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 


<android.support.design.widget.CoordinatorLayout 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/result_tabs" 
      android:background="@color/grey" 
      app:tabTextColor="@color/medium_grey" 
      app:tabSelectedTextColor="@color/colorPrimary" 
      app:tabIndicatorColor="@color/colorPrimary" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:tabMode="scrollable"/> 
    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

</android.support.design.widget.CoordinatorLayout> 

</RelativeLayout> 

Надеюсь, это поможет другим людям в d irection для их решения.

+0

Итак, где должен OnFragmentInteractionListener идти? в родительской активности или в фрагменте? –

-1

Чтобы получить более полный ответ на вопрос BENN1TH, я сделал это с throw a fragment из ActivityMain с вкладками.


    public class MainActivity extends AppCompatActivity { 

    Button throwFragment; 

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

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     throwFragment = (Button) findViewById(R.id.throwFragment); 

     //I add a fragment at run time 
     throwFragment.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       //I get the fragments manager instance 
       FragmentManager fragmentManager = getSupportFragmentManager(); 

       //I create a transaction 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

       //I create a new fragment and add it to the layout of the activity 
       FixturesTabs fixturesTabs = new FixturesTabs(); 
       fragmentTransaction.replace(R.id.containerTabs, fixturesTabs); 

       //I confirm the change    
       fragmentTransaction.commit(); 
      } 
     }); 
    } 
    } 

activity_main.xml Компоновка принадлежность к основному виду деятельности, где я создал кнопку, чтобы бросить фрагмент во время выполнения.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="org.itdevelopers.braian.tabsinsidefragment.MainActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay" /> 

    </android.support.design.widget.AppBarLayout> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:id="@+id/containerTabs"/> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:layout_gravity="center"> 

     <Button 
      android:id="@+id/throwFragment" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="I throw fragment with tabs" /> 
    </LinearLayout> 
</android.support.design.widget.CoordinatorLayout> 

ВАЖНО: Основной вид деятельности будет контекст фрагмента с вкладками, и в дизайне этого необходимо отметить важность следующей строки, чтобы следовать стилю в дизайне.

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

app:layout_behavior="@string/appbar_scrolling_view_behavior" 

Запуск фрагмент с вкладками может быть очень полезным при использовании Снизу панель навигации, потому что если мы будем использовать вкладки по умолчанию, которые участвуют в деятельности, это будет потреблять больше ресурсов (проверить это в Android Studio Logcat с «Без фильтров» в миллисекундах).

  • Мораль *: Предпочтительно использовать TabbedFragment.

Это мой первый комментарий в сообществе, я надеюсь, что я мог бы сотрудничать с чем-то. Благодарю.

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