Kotlin Android:启动SecondActivity后底部导航栏不显示问题排查
问题:启动SecondActivity后MainActivity底部导航栏消失
我是Kotlin新手,正在开发一款带底部导航栏的应用,导航栏用于切换Home、Voices、Settings三个Fragment,同时还有一个基于NumberPicker的时间选择器页面SecondActivity。目前遇到的问题是:在MainActivity的onCreate方法中添加启动SecondActivity的Intent代码后,底部导航栏无法显示;移除这段Intent代码后,导航栏能正常显示并工作。请问问题出在哪里?
MainActivity.kt
package com.example.helloworld import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import com.example.helloworld.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.bottomNavigationView.setOnItemSelectedListener { when (it.itemId) { R.id.first -> replaceFragment(Home()) R.id.second -> replaceFragment(Voices()) R.id.third -> replaceFragment(Settings()) else -> { } } true } replaceFragment(Home()) Intent(this, SecondActivity::class.java).also { startActivity(it) } } private fun replaceFragment(fragment: Fragment) { val fragmentManager = supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() fragmentTransaction.replace(R.id.frameLayout, fragment) fragmentTransaction.commit() } }
SecondActivity.kt
package com.example.helloworld import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_second.* class SecondActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_second) numPickerMin2.minValue = 0 numPickerMin2.maxValue = 23 numPickerSec2.minValue = 0 numPickerSec2.maxValue = 59 var min = 0 var sec = 0 var amOrPm = "" val str = arrayOf<String>("AM", "PM") numPickerAM2.minValue = 0 numPickerAM2.maxValue = (str.size - 1) numPickerAM2.displayedValues = str numPickerMin2.setOnValueChangedListener { numberPicker, i, i2 -> min = numberPicker.value } numPickerSec2.setOnValueChangedListener { numberPicker, i, i2 -> sec = numberPicker.value } numPickerAM2.setOnValueChangedListener { numberPicker, i, i2 -> val i = numberPicker.value amOrPm = str[i] } btGetValue2.setOnClickListener { reminderTime2.text = "$min : $sec : $amOrPm" } } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.helloworld" android:installLocation="preferExternal" android:versionCode="1" android:versionName="0.2"> <uses-sdk android:minSdkVersion="18" android:targetSdkVersion="27" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" tools:targetApi="31" android:theme="@style/Theme.HelloWorld"> <activity android:name=".MainActivity" android:exported="true" android:screenOrientation="sensorPortrait" android:label="@string/app_name" android:launchMode="singleInstance"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity"> </activity> </application> </manifest>
ActivityMain.xml
<?xml version="1.0" encoding="utf-8"?> <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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <FrameLayout android:id="@+id/frameLayout" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@id/bottomNavigationView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> </FrameLayout> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottomNavigationView" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:menu="@menu/bottom_nav"/> </androidx.constraintlayout.widget.ConstraintLayout>
activity_second.xml
<?xml version="1.0" encoding="utf-8"?> <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:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginStart="1dp" android:layout_marginTop="1dp" android:layout_marginEnd="1dp" android:layout_marginBottom="1dp" android:background="@color/BackgroundFirst" tools:context=".Home"> <com.google.android.material.textfield.TextInputLayout android:id="@+id/textInputLayout4" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" android:layout_marginTop="55dp" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintStart_toStartOf="@+id/guideline2" app:layout_constraintTop_toTopOf="@+id/guideline3"> <AutoCompleteTextView android:id="@+id/dropdown_field" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="none" android:text="Choose Alert"/> </com.google.android.material.textfield.TextInputLayout> <com.shawnlin.numberpicker.NumberPicker android:id="@+id/numPickerMin2" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_centerInParent="true" android:layout_marginEnd="23dp" android:gravity="center" android:theme="@style/AppTheme.Picker" app:layout_constraintBottom_toBottomOf="@+id/numPickerSec2" app:layout_constraintEnd_toStartOf="@+id/numPickerSec2" app:layout_constraintTop_toTopOf="@+id/numPickerSec2" app:np_dividerColor="@color/black" app:np_dividerDistance="55dp" app:np_dividerLength="100dp" app:np_dividerThickness="3dp" app:np_formatter="" app:np_height="180dp" app:np_max="12" app:np_min="0" app:np_selectedTextColor="@color/selected" app:np_selectedTextSize="60sp" app:np_textAlign="textAlignCenter" app:np_textColor="@color/black" app:np_textSize="40sp" app:np_typeface="@string/roboto_light" app:np_value="1" app:np_wheelItemCount="10" app:np_width="74dp" app:np_wrapSelectorWheel="true" /> <com.shawnlin.numberpicker.NumberPicker android:id="@+id/numPickerSec2" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_centerInParent="true" android:layout_marginTop="37dp" android:layout_marginEnd="9dp" android:layout_marginBottom="27dp" android:gravity="center" android:theme="@style/AppTheme.Picker" app:layout_constraintBottom_toTopOf="@+id/textInputLayout4" app:layout_constraintEnd_toStartOf="@+id/numPickerAM2" app:layout_constraintTop_toBottomOf="@+id/imageView2" app:np_dividerColor="@color/black" app:np_dividerDistance="55dp" app:np_dividerLength="100dp" app:np_dividerThickness="3dp" app:np_formatter="" app:np_height="180dp" app:np_max="59" app:np_min="0" app:np_selectedTextColor="@color/selected" app:np_selectedTextSize="60sp" app:np_textAlign="textAlignCenter" app:np_textColor="@color/black" app:np_textSize="40sp" app:np_typeface="@string/roboto_light" app:np_value="1" app:np_wheelItemCount="10" app:np_width="74dp" app:np_wrapSelectorWheel="true" /> <com.shawnlin.numberpicker.NumberPicker android:id="@+id/numPickerAM2" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_centerInParent="true" android:layout_marginStart="56dp" android:layout_marginEnd="55dp" android:gravity="center" android:theme="@style/AppTheme.Picker" app:layout_constraintBottom_toBottomOf="@+id/numPickerSec2" app:layout_constraintEnd_toEndOf="@+id/imageView2" app:layout_constraintStart_toStartOf="@+id/guideline2" app:layout_constraintTop_toTopOf="@+id/numPickerSec2" app:np_dividerColor="@color/black" app:np_dividerDistance="55dp" app:np_dividerLength="100dp" app:np_dividerThickness="3dp" app:np_formatter="" app:np_height="180dp" app:np_max="1" app:np_min="0" app:np_selectedTextColor="@color/selected" app:np_selectedTextSize="60sp" app:np_textAlign="textAlignCenter" app:np_textColor="@color/black" app:np_textSize="40sp" app:np_typeface="@string/roboto_light" app:np_value="1" app:np_wheelItemCount="10" app:np_width="74dp" app:np_wrapSelectorWheel="true" /> <Button android:id="@+id/btGetValue2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="78dp" android:backgroundTint="@color/selected" android:baselineAligned="false" android:text="Get Time" android:textSize="15sp" app:layout_constraintBottom_toTopOf="@+id/reminderTime2" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintStart_toStartOf="@+id/guideline2" /> <TextView android:id="@+id/reminderTime2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginBottom="63dp" android:text="Time" android:textSize="40sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintStart_toStartOf="@+id/guideline2" /> <ImageView android:id="@+id/imageView2" android:layout_width="351dp" android:layout_height="103dp" android:layout_marginTop="16dp" android:layout_weight="1" android:scaleX="1.5" android:scaleY="1.5" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintStart_toStartOf="@+id/guideline2" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/helloday_logo" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.5" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.5" /> </androidx.constraintlayout.widget.ConstraintLayout>
问题原因与解决方法
原因
你在MainActivity的onCreate方法中直接调用startActivity(SecondActivity),导致应用启动后SecondActivity立即覆盖了MainActivity的界面——此时屏幕上显示的是SecondActivity的内容,MainActivity被压入后台任务栈,自然看不到它的底部导航栏。
解决方法
1. 移除自动跳转代码(最直接)
如果SecondActivity是需要用户主动触发才打开的(比如点击Fragment里的按钮、导航栏选项),直接删掉MainActivity中自动启动SecondActivity的代码,将跳转逻辑移到对应的交互事件中。
修改后的MainActivity.kt:
package com.example.helloworld import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import com.example.helloworld.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.bottomNavigationView.setOnItemSelectedListener { when (it.itemId) { R.id.first -> replaceFragment(Home()) R.id.second -> replaceFragment(Voices()) R.id.third -> replaceFragment(Settings()) } true } replaceFragment(Home()) // 移除自动启动SecondActivity的代码 } private fun replaceFragment(fragment: Fragment) { val fragmentManager = supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() fragmentTransaction.replace(R.id.frameLayout, fragment) fragmentTransaction.commit() } }
2. 将跳转逻辑移到用户交互事件中
比如在HomeFragment中添加按钮,点击后打开SecondActivity:
// HomeFragment.kt class HomeFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_home, container, false) val openTimePickerBtn = view.findViewById<Button>(R.id.open_time_picker_btn) openTimePickerBtn.setOnClickListener { val intent = Intent(requireContext(), SecondActivity::class.java) startActivity(intent) } return view } }
相关产品推荐
相关产品推荐

