2x 导航栏 Android
2x Navigation bar Android
我希望你对我温柔一点,因为我是 android 的编程新手。
我正在做一个项目,我需要 2 个导航栏。首先,我添加了导航栏模板,我可以通过从左向右滑动来访问它。导航栏有效,我可以根据我在导航栏上单击的项目更改片段。
模板导航栏
但是我还需要屏幕底部的另一个导航栏。始终可见的导航栏。
底部导航栏
从我在代码中看到的布局是应该的,但是当我将它输入到模板制作的 onNavigationItemSelected 中时,当我单击底部导航栏中的项目时没有任何反应。
@RequiresApi(api = Build.VERSION_CODES.M)
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_startside) {
// Handle the startside
Toast.makeText( this, "Startside", Toast.LENGTH_SHORT ).show();
//telefonSensor();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new StartsideFragment() );
ft.commit();
// onImageGalleryClicked();
} else if (id == R.id.bot_home) {
Toast.makeText( this, "Startside", Toast.LENGTH_SHORT ).show();
//telefonSensor();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new StartsideFragment() );
ft.commit();
} else if (id == R.id.nav_projektkonfiguration) {
Toast.makeText( this, "Projekt Konfiguration", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new ProjektKonfigurationFragment() );
ft.commit();
} else if (id == R.id.nav_tabel) {
Toast.makeText( this, "Data Tabel", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new DataTabelFragment() );
ft.commit();
//idFrag = (TextView) findViewById( R.id.idTX );
//idFrag.setText("Hej");
System.out.println( "DET ER HER DU SKAL KIGGE LIGE NU YUSUF" );
} else if (id == R.id.bot_dashboard) {
Toast.makeText( this, "Data Tabel", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new DataTabelFragment() );
ft.commit();
//idFrag = (TextView) findViewById( R.id.idTX );
//idFrag.setText("Hej");
System.out.println( "DET ER HER DU SKAL KIGGE LIGE NU YUSUF" );
} else if (id == R.id.nav_plot) {
Toast.makeText( this, "Data Plot", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new DataPlotFragment() );
ft.commit();
} else if (id == R.id.nav_sensoroversigt) {
Toast.makeText( this, "Sensor Oversigt", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new SensorOversigtFragment() );
ft.commit();
} else if (id == R.id.nav_registrersensor) {
Toast.makeText( this, "Tilføj Sensor", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new TilfojSensorFragment() );
ft.commit();
} else if (id == R.id.nav_kontakt) {
Toast.makeText( this, "Kontakt os her", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new KontaktFragment() );
ft.commit();
} else if (id == R.id.bot_kontakt) {
Toast.makeText( this, "Kontakt os her", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new KontaktFragment() );
ft.commit();
} else if (id == R.id.nav_logud) {
firebaseAuth.getInstance().signOut();
Toast.makeText( this, "You're succesfully logged out", Toast.LENGTH_SHORT ).show();
Intent intent = new Intent( this, LoginActivity.class );
startActivity( intent );
// login();
}
DrawerLayout drawer = (DrawerLayout) findViewById( R.id.drawer_layout );
drawer.closeDrawer( GravityCompat.START );
return true;
}
- bot_home
- bot_dashboard
- bot_kontakt
以上id来自底部导航栏。问题当然是,我如何编码,以便当我单击底部导航栏上的这些项目时,它会更改片段。我必须编写一个新的 "onNavigationItemSelected" 代码吗?我不希望这就是答案。我希望你有答案!
提前致谢!
* 更新 *
在我的 onCreate 中我有这个:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
onCreate2();
final android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
BottomNavigationView mBottomNav = (BottomNavigationView) findViewById( R.id.nav_bot );
mBottomNav.setOnNavigationItemSelectedListener( new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.bot_home:
//Toast.makeText( this, "Startside", Toast.LENGTH_SHORT ).show();
//telefonSensor();
fragment = new StartsideFragment();
/*ft.replace( R.id.flMain, new StartsideFragment() );
ft.commit();*/
break;
case R.id.bot_dashboard:
//Toast.makeText( this, "Startside", Toast.LENGTH_SHORT ).show();
//telefonSensor();
//android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
fragment = new DataTabelFragment();
//ft.replace( R.id.flMain, new DataTabelFragment() );
//ft.commit();
//fragment = new DataTabelFragment();
break;
case R.id.bot_kontakt:
//Toast.makeText( this, "Startside", Toast.LENGTH_SHORT ).show();
//telefonSensor();
//android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
/*ft.replace( R.id.flMain, new KontaktFragment() );
ft.commit();*/
break;
}
if (fragment != null) {
//FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, fragment );
ft.commit();
}
return true;
}
} );
}
但是在它崩溃之前我只能使用一次底部导航栏
LogCat:
09-24 14:57:47.304 2954-2954/com.example.yusuf.cxweb E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.yusuf.cxweb, PID: 2954
java.lang.IllegalStateException: commit already called
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:666)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:634)
at com.example.yusuf.cxweb.MainActivity.onNavigationItemSelected(MainActivity.java:360)
at android.support.design.widget.BottomNavigationView.onMenuItemSelected(BottomNavigationView.java:182)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)
at android.support.design.internal.BottomNavigationMenuView.onClick(BottomNavigationMenuView.java:95)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
解法:
在onCreate()
中写下:
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.your_id:
Class fragmentClass;
Fragment fragment;
fragmentClass = StartsideFragment.class;
try {
fragment = (Fragment) fragmentClass.newInstance();
}
catch(Exception e) {
}
fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerLayout.closeDrawer(GravityCompat.START);
break:
case R.id.your_id:
..... (Your Fragment Code)
break:
}
return true;
}
}
试试吧。希望对你有帮助。
您的布局 xml 文件应具有如下属性:
<android.support.design.widget.BottomNavigationView
.......
app:menu="@menu/bottom_navigation_items"/>
还有这样一个菜单资源文件:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/nav_startside"
android:icon="@drawable/ic_account_box_black_24dp"
android:title="@string/item_1"/>
<item
android:id="@+id/nav_plot"
android:icon="@drawable/ic_account_circle_black_24dp"
android:title="@string/item_2"/>
......
</menu>
如果你已经有了上面的文件,也许你忘记了像这样注册事件监听器:
BottomNavigationView mBottomNav= (BottomNavigationView)findViewById(R.id.navigation);
mBottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
// handle desired action here
return true;
}
});
**Edited**
试试这个:
Fragment fragment = null;
switch (viewId) {
case R.id.bot_home:
fragment = new StartsideFragment();
break;
case R.id.bot_dashboard:
fragment = new DataTabelFragment();
break;
}
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.flMain, fragment);
ft.commit();
}
已更新
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, fragment );
ft.commit();
}
并删除这个:
final android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
我希望你对我温柔一点,因为我是 android 的编程新手。
我正在做一个项目,我需要 2 个导航栏。首先,我添加了导航栏模板,我可以通过从左向右滑动来访问它。导航栏有效,我可以根据我在导航栏上单击的项目更改片段。
模板导航栏
但是我还需要屏幕底部的另一个导航栏。始终可见的导航栏。
底部导航栏
从我在代码中看到的布局是应该的,但是当我将它输入到模板制作的 onNavigationItemSelected 中时,当我单击底部导航栏中的项目时没有任何反应。
@RequiresApi(api = Build.VERSION_CODES.M)
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_startside) {
// Handle the startside
Toast.makeText( this, "Startside", Toast.LENGTH_SHORT ).show();
//telefonSensor();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new StartsideFragment() );
ft.commit();
// onImageGalleryClicked();
} else if (id == R.id.bot_home) {
Toast.makeText( this, "Startside", Toast.LENGTH_SHORT ).show();
//telefonSensor();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new StartsideFragment() );
ft.commit();
} else if (id == R.id.nav_projektkonfiguration) {
Toast.makeText( this, "Projekt Konfiguration", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new ProjektKonfigurationFragment() );
ft.commit();
} else if (id == R.id.nav_tabel) {
Toast.makeText( this, "Data Tabel", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new DataTabelFragment() );
ft.commit();
//idFrag = (TextView) findViewById( R.id.idTX );
//idFrag.setText("Hej");
System.out.println( "DET ER HER DU SKAL KIGGE LIGE NU YUSUF" );
} else if (id == R.id.bot_dashboard) {
Toast.makeText( this, "Data Tabel", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new DataTabelFragment() );
ft.commit();
//idFrag = (TextView) findViewById( R.id.idTX );
//idFrag.setText("Hej");
System.out.println( "DET ER HER DU SKAL KIGGE LIGE NU YUSUF" );
} else if (id == R.id.nav_plot) {
Toast.makeText( this, "Data Plot", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new DataPlotFragment() );
ft.commit();
} else if (id == R.id.nav_sensoroversigt) {
Toast.makeText( this, "Sensor Oversigt", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new SensorOversigtFragment() );
ft.commit();
} else if (id == R.id.nav_registrersensor) {
Toast.makeText( this, "Tilføj Sensor", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new TilfojSensorFragment() );
ft.commit();
} else if (id == R.id.nav_kontakt) {
Toast.makeText( this, "Kontakt os her", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new KontaktFragment() );
ft.commit();
} else if (id == R.id.bot_kontakt) {
Toast.makeText( this, "Kontakt os her", Toast.LENGTH_SHORT ).show();
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, new KontaktFragment() );
ft.commit();
} else if (id == R.id.nav_logud) {
firebaseAuth.getInstance().signOut();
Toast.makeText( this, "You're succesfully logged out", Toast.LENGTH_SHORT ).show();
Intent intent = new Intent( this, LoginActivity.class );
startActivity( intent );
// login();
}
DrawerLayout drawer = (DrawerLayout) findViewById( R.id.drawer_layout );
drawer.closeDrawer( GravityCompat.START );
return true;
}
- bot_home
- bot_dashboard
- bot_kontakt
以上id来自底部导航栏。问题当然是,我如何编码,以便当我单击底部导航栏上的这些项目时,它会更改片段。我必须编写一个新的 "onNavigationItemSelected" 代码吗?我不希望这就是答案。我希望你有答案!
提前致谢!
* 更新 *
在我的 onCreate 中我有这个:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
onCreate2();
final android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
BottomNavigationView mBottomNav = (BottomNavigationView) findViewById( R.id.nav_bot );
mBottomNav.setOnNavigationItemSelectedListener( new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.bot_home:
//Toast.makeText( this, "Startside", Toast.LENGTH_SHORT ).show();
//telefonSensor();
fragment = new StartsideFragment();
/*ft.replace( R.id.flMain, new StartsideFragment() );
ft.commit();*/
break;
case R.id.bot_dashboard:
//Toast.makeText( this, "Startside", Toast.LENGTH_SHORT ).show();
//telefonSensor();
//android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
fragment = new DataTabelFragment();
//ft.replace( R.id.flMain, new DataTabelFragment() );
//ft.commit();
//fragment = new DataTabelFragment();
break;
case R.id.bot_kontakt:
//Toast.makeText( this, "Startside", Toast.LENGTH_SHORT ).show();
//telefonSensor();
//android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
/*ft.replace( R.id.flMain, new KontaktFragment() );
ft.commit();*/
break;
}
if (fragment != null) {
//FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, fragment );
ft.commit();
}
return true;
}
} );
}
但是在它崩溃之前我只能使用一次底部导航栏
LogCat:
09-24 14:57:47.304 2954-2954/com.example.yusuf.cxweb E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.yusuf.cxweb, PID: 2954
java.lang.IllegalStateException: commit already called
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:666)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:634)
at com.example.yusuf.cxweb.MainActivity.onNavigationItemSelected(MainActivity.java:360)
at android.support.design.widget.BottomNavigationView.onMenuItemSelected(BottomNavigationView.java:182)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)
at android.support.design.internal.BottomNavigationMenuView.onClick(BottomNavigationMenuView.java:95)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
解法:
在onCreate()
中写下:
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.your_id:
Class fragmentClass;
Fragment fragment;
fragmentClass = StartsideFragment.class;
try {
fragment = (Fragment) fragmentClass.newInstance();
}
catch(Exception e) {
}
fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerLayout.closeDrawer(GravityCompat.START);
break:
case R.id.your_id:
..... (Your Fragment Code)
break:
}
return true;
}
}
试试吧。希望对你有帮助。
您的布局 xml 文件应具有如下属性:
<android.support.design.widget.BottomNavigationView
.......
app:menu="@menu/bottom_navigation_items"/>
还有这样一个菜单资源文件:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/nav_startside"
android:icon="@drawable/ic_account_box_black_24dp"
android:title="@string/item_1"/>
<item
android:id="@+id/nav_plot"
android:icon="@drawable/ic_account_circle_black_24dp"
android:title="@string/item_2"/>
......
</menu>
如果你已经有了上面的文件,也许你忘记了像这样注册事件监听器:
BottomNavigationView mBottomNav= (BottomNavigationView)findViewById(R.id.navigation);
mBottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
// handle desired action here
return true;
}
});
**Edited**
试试这个:
Fragment fragment = null;
switch (viewId) {
case R.id.bot_home:
fragment = new StartsideFragment();
break;
case R.id.bot_dashboard:
fragment = new DataTabelFragment();
break;
}
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.flMain, fragment);
ft.commit();
}
已更新
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace( R.id.flMain, fragment );
ft.commit();
}
并删除这个:
final android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();