在 Android Studio 中处理具有不同底部导航的多个用户界面

如何解决在 Android Studio 中处理具有不同底部导航的多个用户界面

我正在开发一个应用程序,其中有不同的用户界面,具体取决于您是哪种客户。我想根据登录用户类型创建不同的底部导航。 if- 子句有效,所以日志告诉我正确的用户类型,但我收到一个致命的异常,因为它告诉我第二个底部的 id导航不存在,但就像第一个一样。我现在这不是最干净的方法,但我找不到不同的方法。这是我的代码

这是main.kt

class MainActivity : AppCompatActivity() {

    lateinit var homeFragment: HomeFragment
    lateinit var mapsFragment: MapsFragment
    lateinit var profil: Profil
    lateinit var chat: Chat
    lateinit var homeFoto: HomeFoto


    val COARSE_LOCATION_RQ = 101

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val mAuth = FirebaseAuth.getInstance()
        lateinit var mDatabase : DatabaseReference
        val user = mAuth.currentUser
        val uid = user!!.uid
        var snapshot: DataSnapshot
        var anwender = "Suchender"


        mDatabase = FirebaseDatabase.getInstance().getReference("User").child(uid)

        //Log.e("keyKey",mDatabase.database.getReference("Anwendertyp").child(anwender).toString())

        mDatabase!!.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                if (snapshot.exists() && snapshot.child("Anwendertyp").value.toString() == "Suchender" ){
                    Log.e("keyKey",snapshot.child("Anwendertyp").value.toString())

                    //findNavController(R.id.suchenderNavigation)
                    var bottomnav = findViewById<BottomNavigationView>(R.id.BottomNavMenu)

                    bottomnav.setonNavigationItemSelectedListener { item ->
                        when (item.itemId) {
                            R.id.navigation_home -> {
                                homeFragment = HomeFragment()
                                supportFragmentManager
                                    .beginTransaction()
                                    .replace(R.id.frameLayout,homeFragment)
                                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                                    .commit()
                            }

                            R.id.mapsFragment -> {
                                mapsFragment = MapsFragment()
                                supportFragmentManager
                                    .beginTransaction()
                                    .replace(R.id.frameLayout,mapsFragment)
                                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                                    .commit()
                            }

                            R.id.navigation_notifications -> {
                                profil = Profil()
                                supportFragmentManager
                                    .beginTransaction()
                                    .replace(R.id.frameLayout,profil)
                                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                                    .commit()
                            }

                        }

                        true
                    }
                }
                else{
                    setContentView(R.layout.startseite_fotografvideograf)
                    Log.e("key",snapshot.child("Anwendertyp").value.toString())

                   // Navigation.findNavController(HomeFoto().requireActivity(),R.id.navigation_home_fotografvideograf)
                    //findNavController(R.id.fotografNavigation)

//This is the variable that triggers the fatal exception
                    var bottomn = findViewById<BottomNavigationView>(R.id.bottomNavFoto)
                   

                    Log.e("heyo",bottomn.toString())

                    bottomn.setonNavigationItemSelectedListener { item ->
                        when (item.itemId) {
                            R.id.navigation_home_fotografvideograf -> {
                                homeFoto = HomeFoto()
                                supportFragmentManager
                                    .beginTransaction()
                                    .replace(R.id.frameLayout,homeFoto)
                                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                                    .commit()
                            }

                            R.id.navigation_notifications -> {
                                profil = Profil()
                                supportFragmentManager
                                    .beginTransaction()
                                    .replace(R.id.frameLayout,profil)
                                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                                    .commit()
                            }

                            R.id.chatchat -> {
                                chat = Chat()
                                supportFragmentManager
                                    .beginTransaction()
                                    .replace(R.id.frameLayout,chat)
                                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                                    .commit()
                            }

                        }

                        true
                    }
                }
            }
            override fun onCancelled(error: DatabaseError) {
            }
        })
}

这是main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.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:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E8E8E8">


    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_margin="30dp"
        android:background="@drawable/buttom_bg"
        android:elevation="2dp"
        app:itemIconSize="30dp"
        app:itemIconTint="@drawable/item_selector"
        app:itemRippleColor="@android:color/transparent"
        app:labelVisibilityMode="unlabeled"
        app:menu="@menu/bottom_nav_menu" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavFoto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_margin="30dp"
        android:background="@drawable/buttom_bg"
        android:elevation="2dp"
        app:itemIconSize="30dp"
        app:itemIconTint="@drawable/item_selector"
        app:itemRippleColor="@android:color/transparent"
        app:labelVisibilityMode="unlabeled"
        app:menu="@menu/bottom_nav_fotograf" />


</androidx.coordinatorlayout.widget.CoordinatorLayout>

这是第二个底部导航的xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/BottomNavFotograf"
    >

    <item
        android:id="@+id/navigation_home_fotografvideograf"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/title_home" />

    <item
        android:id="@+id/navigation_notifications"
        android:icon="@drawable/ic_baseline_person_24"
        android:title="@string/profil" />

    <item
        android:id="@+id/chatchat"
        android:icon="@drawable/ic_chat"
        android:title="Chat" />

</menu>

更新

这是我得到的致命异常:

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.discoverme,PID: 4430 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.android.material.bottomnavigation.BottomNavigationView.toString()' on a null object reference at com.example.discoverme.MainActivity$onCreate$1.onDataChange(MainActivity.kt:114) at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) at – Luzie Ewert 19 hours ago    Delete
com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) 

喜欢,这太令人困惑了。我知道它必须与 id 或一个布局中不能有两个底部导航的事实有关,但我无法以任何其他方式帮助自己,我无法分辨第一个底部导航的第一个 id 在哪里来自,因为它没有声明,如果我使用我在 xml 中使用的 ID 之一,应用程序就会崩溃并且我得到同样的致命错误(axception 告诉我引用位于空对象上。

好的,更新:我找到了正确的 ID。显然有两个现有的 main.xml 文件,我不得不删除一个,但现在我只得到一个底部导航,无论哪个用户搜索人或摄影师)登录。问题仍然是,如何我可以把它们分开吗?
这是更新后的 xml:

<androidx.constraintlayout.widget.ConstraintLayout
    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:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E8E8E8">


    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/BottomNavMenu"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center"
        android:layout_margin="30dp"
        android:background="@drawable/buttom_bg"
        android:elevation="2dp"
        app:itemIconSize="30dp"
        app:itemIconTint="@drawable/item_selector"
        app:itemRippleColor="@android:color/transparent"
        app:labelVisibilityMode="unlabeled"
        app:menu="@menu/bottom_nav_menu"
        tools:ignore="MissingConstraints">
    </com.google.android.material.bottomnavigation.BottomNavigationView>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavFoto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_margin="30dp"
        android:background="@drawable/buttom_bg"
        android:elevation="2dp"
        app:itemIconSize="30dp"
        app:itemIconTint="@drawable/item_selector"
        app:itemRippleColor="@android:color/transparent"
        app:labelVisibilityMode="unlabeled"
        app:layout_constraintBottom_toBottomOf="@+id/frameLayout"
        app:menu="@menu/bottom_nav_fotograf"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteX="30dp"></com.google.android.material.bottomnavigation.BottomNavigationView>


</androidx.constraintlayout.widget.ConstraintLayout>

解决方法

好的,我通过将新活动中的底部导航外包并在主 activity.kt 的 if 子句中使用新布局来管理它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?