【问题标题】:How do I create a customized action bar in Kotlin fragment activity class如何在 Kotlin 片段活动类中创建自定义操作栏
【发布时间】:2019-11-28 00:27:01
【问题描述】:

我正在尝试从 Android Studio 的底部导航活动模板自定义片段类和活动类以生成自定义操作栏,但是当我在模拟器上运行应用程序时自定义操作栏没有出现。

这是带有initializeCustomActionBar() 方法的自定义活动类:

class CountriesActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_countries)
        val navView: BottomNavigationView = findViewById(R.id.nav_view)
        navView.setItemIconTintList(null);

        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        val appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.navigation_england, R.id.navigation_scotland, R.id.navigation_wales, R.id.navigation_nireland
            )
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }

    fun initializeCustomActionBar() {

        val actionBar: android.app.ActionBar? = getActionBar()
        actionBar?.displayOptions = DISPLAY_SHOW_CUSTOM
        actionBar?.setCustomView(R.layout.custom_action_bar)
        actionBar?.setDisplayShowCustomEnabled(true)
        actionBar?.show()

    }
}

这是调用initializeCustomActionBar()方法的自定义片段类:

class EnglandFragment : Fragment() {

    private lateinit var englandViewModel: EnglandViewModel

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        englandViewModel =
            ViewModelProviders.of(this).get(EnglandViewModel::class.java)
        val root = inflater.inflate(R.layout.fragment_england, container, false)
        val textView: TextView = root.findViewById(R.id.text_england)
        englandViewModel.text.observe(this, Observer {
            textView.text = it

            var mContext : FragmentActivity?  = FragmentActivity()
            mContext = this!!.getActivity() as CountriesActivity
            mContext.initializeCustomActionBar()

        })
        return root
    }
}

【问题讨论】:

    标签: android android-studio kotlin android-actionbar


    【解决方案1】:

    您只需要使用 Activity 实现的接口即可。

    先在自己的文件中定义接口,例如CountriesActivityListener.kt

    interface CountriesActivityListener {
        fun initializeCustomActionBar()
    }
    

    在activity中实现接口:

    class CountriesActivity : AppCompatActivity(), CountriesActivityListener {
    
        //........
    
        override fun initializeCustomActionBar() {
            val actionBar: android.app.ActionBar? = actionBar
            actionBar?.let {
                it.displayOptions = DISPLAY_SHOW_CUSTOM
                it.setCustomView(R.layout.custom_action_bar)
                it.show()
            }
        }
    }
    

    使用片段中的接口:

    class EnglandFragment : Fragment() {
    
        private lateinit var englandViewModel: EnglandViewModel
    
         // Define the reference to the interface listener:
        private lateinit var contriesActivityListener: CountriesActivityListener
    
        // Setup the interface listener in the onAttach override:
        override fun onAttach(context: Context) {
            contriesActivityListener = activity as CountriesActivityListener
            super.onAttach(context)
        }
    
        override fun onCreateView(
                inflater: LayoutInflater,
                container: ViewGroup?,
                savedInstanceState: Bundle?
        ): View? {
            englandViewModel =
                    ViewModelProviders.of(this).get(EnglandViewModel::class.java)
            val root = inflater.inflate(R.layout.fragment_england, container, false)
            val textView: TextView = root.findViewById(R.id.text_england)
            englandViewModel.text.observe(this, Observer {
                textView.text = it
    
                // Use the interface method:
                contriesActivityListener.initializeCustomActionBar()
            })
            return root
        }
    }
    

    【讨论】:

    • 我现在找到了initializeCustomToolBar() 方法,但是当我运行应用程序时自定义工具栏没有出现
    • 很难说为什么它不起作用。确保您使用的是包含默认操作栏的主题。另一种选择是使用没有默认操作栏的主题,并将您的自定义工具栏放在布局 xml 中。如果你走那条路,你可以使用接口监听器来修改每个片段的工具栏/操作栏(这是我通常做的)。
    • 谢谢,我确实尝试将主题更改为无操作栏,但随后出现运行时错误,提示操作栏的标题引用为空。
    • java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference
    • 我已经尝试过您建议使用界面的方法,但仍然无法正常工作
    【解决方案2】:

    我将initializeCustomActionBar() 编辑为:

    fun initializeCustomActionBar() {
    
        val actionBar: ActionBar? = this.supportActionBar
        actionBar?.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM)
        actionBar?.setDisplayShowCustomEnabled(true)
        actionBar?.setCustomView(R.layout.custom_action_bar)
    }
    

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多