2x Панель навигации Android - PullRequest
       11

2x Панель навигации Android

0 голосов
/ 24 сентября 2018

Надеюсь, вы будете мягки ко мне, так как я новичок в программировании на Android.

Я работаю над проектом, где мне нужно 2 панели навигации.Для начала я добавил шаблон панели навигации, где я могу получить к нему доступ, проводя слева направо.Панель навигации работает, и я могу изменить фрагмент в зависимости от того, какой элемент я нажимаю на панели навигации.

Панель навигации по шаблону

Template Navigation bar

Но тогда мне также понадобится еще одна панель навигации внизу экрана.Панель навигации, которая всегда видна.

Нижняя панель навигации

Bottom Navigation bar

Макет такой, каким он должен быть, из того, что я вижу в коде, но когда явведите его в 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

Над идентификаторами с нижней панели навигации.Вопрос, конечно, в том, как мне кодировать, чтобы, когда я нажимал на эти элементы в нижней панели навигации, тогда менялся фрагмент.Должен ли я кодировать новый "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)

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Ваш файл макета 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();
0 голосов
/ 24 сентября 2018

Решение:

Запишите это в 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;
       }
 }

Попробуйте.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...