【问题标题】:2x Navigation bar Android2x 导航栏 Android
【发布时间】:2018-09-24 11:56:25
【问题描述】:

我希望你对我温柔,因为我是 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$1.onNavigationItemSelected(MainActivity.java:360)
    at android.support.design.widget.BottomNavigationView$1.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$1.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)

【问题讨论】:

  • 是,但不一样:-模板导航栏->activity_main_drawer.xml &底部导航栏->navigation.xml
  • 你必须使用onBottomNavigationItemSelector,看看我下面的答案。
  • 你必须创建不同的导航项选择监听器

标签: android fragment navigationbar


【解决方案1】:

您的布局 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();

【讨论】:

  • 感谢您的帮助。如果您有时间,请阅读我在问题中的更新,因为它现在演变成另一个问题!
  • 我试过这个,但是这样做的时候总是崩溃
  • 任何 logcat 信息?
  • 是的,刚刚编辑了我的问题更新。应该有
  • 现在可以使用了。我是一个白痴。我有“FragmentTransaction ft = getSupportFragmentManager().beginTransaction();”在 if 循环和 switch 之外。非常感谢男人
【解决方案2】:

解决方案:

写在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;
       }
 }

试试看。希望对您有所帮助。

【讨论】:

  • 感谢您的帮助。如果您有时间,请阅读我在问题中的更新,因为它现在演变成另一个问题!
  • @Buster3650 检查我更新的答案,这就是我在项目中的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多