Что я пытался сделать
Что я стремился сделать в течение нескольких дней, так это использовать Activity
, который implements
NavigationView.OnNavigationItemSelectedListener
. Я хочу, чтобы это создало две вкладки внутри android.support.v4.app.Fragment
в FrameLayout
, предоставленном шаблоном для ящика навигации в Android Studio 1.5.1.
– Моя текущая активность использует панель инструментов, а не панель действий.
- Я надеялся использовать ViewPager
; следовательно, необходимо использовать Support Fragments
.
. Я просмотрел несколько примеров кода в Интернете и просмотрел Справочник для разработчиков Android.
Другие связанные сообщения:
Android TabHost внутри фрагмента | Выбранный ответ -> с использованием FragmentActivity эм>а> | К сожалению, использует новую активность FragmentActivity, но мне нужно сохранить свой NavigationDrawer, поэтому я использую одну активность
Android TabHost только внутри одного фрагмента (NavigationDrawer) | Мне это особо не помогло, так как я новичок в использовании вкладок
Добавление вкладки Android внутри фрагмента | Выбранный ответ -> с использованием FragmentTabHost | Я взял FragmentTabHost
код XML и Java из этого примера, но это не сработало
Вкладки в классе, который расширяет фрагмент | Ответ ссылается на документацию Google, которая у меня не работает.
Добавление вкладки внутри фрагмента в Android? | Используется android.app.Fragment
, и предложенный ответ не работает.
Использование TabLayout внутри фрагмента; текст на вкладке невидим | Я использую библиотеку дизайна v23.1.1
| Ошибки, о которых сообщалось в v22.2.1
. Код здесь также не дал мне никаких вкладок
Будем признательны за любые предложения.
МОЙ КОД
Класс NavActivity
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
public class NavigationMenuActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
Toolbar toolbar;
DrawerLayout drawerLayout;
ActionBarDrawerToggle toggle;
NavigationView navigationView;
FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.navmenu_act);
//Setting up the Toolbar
toolbar = (Toolbar) findViewById(R.id.navmenu_appbar_tbar);
setSupportActionBar(toolbar);
//Set up the action bar toggle
drawerLayout = (DrawerLayout) findViewById(R.id.navmenu_act_drawerlay);
toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawerLayout.setDrawerListener(toggle);
toggle.syncState();
//Set up the navigation View
navigationView = (NavigationView) findViewById(R.id.navmenu_nav_view);
navigationView.setNavigationItemSelectedListener(this);
//SET THE FRAGMENT
fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.navmenu_appbar_fl);
if(fragment==null) { //If no fragment exists relate the fragment
fragment = new TabLayoutFragmentExample();
fragmentManager.beginTransaction()
.add(R.id.navmenu_appbar_fl, fragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
}
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.navmenu_act_drawerlay);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_profile) {
fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.navmenu_appbar_fl);
if(fragment!=null) { //If a fragment exists replace the fragment
fragment = new TestFragmentNoTabs();
fragmentManager.beginTransaction()
.replace(R.id.navmenu_appbar_fl, fragment)
.commit();
}
} else if (id == R.id.nav_near_me) {
// Handle the near me action here
} else if (id == R.id.nav_proximity) {
// Handle the proximity action
fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.navmenu_appbar_fl);
if(fragment!=null) {//If A fragment exists replace the fragment
fragment = new TestFragmentNoTabsTWO();
fragmentManager.beginTransaction()
.replace(R.id.navmenu_appbar_fl, fragment)
.commit();
}
}
//Close the drawerLayout after it is clicked?
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.navmenu_act_drawerlay);
drawer.closeDrawer(GravityCompat.START);
return true;
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
//sync the toggle
toggle.syncState();
}
}
navmenu_appbar.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=".NavigationMenuActivity">
<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/navmenu_appbar_tbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/JethrosTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/navmenu_appbar_fl"
android:layout_width="match_parent"
android:layout_height="match_parent"></FrameLayout>
</android.support.design.widget.CoordinatorLayout>
Класс TablayoutFragmentExample
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
public class TabLayoutFragmentExample extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View inflatedView = inflater.inflate(R.layout.tab_layout_frag, container, false);
TabLayout tabLayout = (TabLayout) inflatedView.findViewById(R.id.tab_layout_frag_tl);
tabLayout.addTab(tabLayout.newTab().setText("Tab1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab2"));
final ViewPager viewPager = (ViewPager) inflatedView.findViewById(R.id.tab_layout_frag_vp);
viewPager.setAdapter(new PagerAdapter //ChildFragManager; Tnx @Luksprog
(getChildFragmentManager(), tabLayout.getTabCount()));
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setupWithViewPager(viewPager); //Set Viewpager; Tnx @Luksprog
return inflatedView;
}
public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
TestFragmentNoTabs tab1 = new TestFragmentNoTabs();
return tab1;
case 1:
TestFragmentNoTabsTWO tab2 = new TestFragmentNoTabsTWO();
return tab2;
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
}
tab_layout_frag.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout_frag_tl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
app:tabGravity="fill"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
<android.support.v4.view.ViewPager
android:id="@+id/tab_layout_frag_vp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"/>
</android.support.design.widget.AppBarLayout>
TestFragmentNoTabs и TestFragmentNoTabsTWO (фрагмент 1 и фрагмент 2)
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
public class TestFragmentNoTabs extends Fragment {
public final String TAG = "TestFragmentNoTabs";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Inflate the fragment view
View view = inflater.inflate(R.layout.testfragnotabs, container, false);
return view; //Return the view to the activity
}
@Override
public void onPause() {
super.onPause();
}
}
testfragnotabs.xml (аналогично testfragnotabstwo.xml)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/nearme_frag_rlay"
android:clickable="false">
<TextView
android:id="@+id/nearme_frag_tv_seclab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" TestFragmentNoTabsOne -> testfragnotabs.xml" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/textView1"
android:layout_above="@+id/nearme_frag_tv_seclab" />
</RelativeLayout>
Текущая ситуация с приведенным выше кодом
Проект строится нормально, и навигационный ящик тоже работает нормально. Однако макет фрейма, в котором должны отображаться фрагмент и TabLayout, пуст с белым фоном (так же, как предварительный просмотр дизайна в tab_layout_frag.xml; это может означать, что существует проблема с ViewPager или TabLayout?).