В этом приложении у меня есть MainFragment, я попытался добавить к нему панель действий и панель инструментов с меню параметров, панель действий отображается, но меню параметров нет, также кнопка возврата не работает, хотя я добавляю код для вызова onBackPressed

< Сильный > fragment_main.xml

<LinearLayout 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:orientation="vertical"
    tools:context="com.mml.mig33.fragments.MainFragment">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/Theme.Mig33.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/Theme.Mig33.PopupOverlay">

            <de.hdodenhof.circleimageview.CircleImageView
                android:layout_width="@dimen/_32sdp"
                android:layout_height="@dimen/_32sdp"
                android:src="@drawable/ic_profile"
                android:tint="@color/white" />

            <TextView
                android:id="@+id/userNameTV"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="20dp"
                android:text="username"
                android:textColor="@color/white"
                android:textSize="@dimen/_18ssp"
                android:textStyle="bold">

            </TextView>

        </androidx.appcompat.widget.Toolbar>

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        </com.google.android.material.tabs.TabLayout>

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewPager2"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </com.google.android.material.appbar.AppBarLayout>

</LinearLayout>

Класс MainFragment

class MainFragment : Fragment(R.layout.fragment_main) {

    private var _binding: FragmentMainBinding? = null

    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {

        _binding = FragmentMainBinding.inflate(inflater, container, false)

        setHasOptionsMenu(true)
        binding.toolbar.apply {
            title = ""
            setNavigationIcon(R.drawable.ic_baseline_arrow_back_24)
            setNavigationOnClickListener {

                activity?.onBackPressedDispatcher?.onBackPressed()

            }

        }

        return binding.root

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val viewPageAdapter = ViewPageAdapter(childFragmentManager, lifecycle)
        binding.viewPager2.adapter = viewPageAdapter
        val tabTitles = arrayOf("Chat", "Search", "Settings")

        TabLayoutMediator(binding.tabLayout, binding.viewPager2) { tab, position ->
            when (position) {
                0 -> tab.text = tabTitles[0]
                1 -> tab.text = tabTitles[1]
                2 -> tab.text = tabTitles[2]
            }

        }.attach()


    }

    private inner class ViewPageAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
        FragmentStateAdapter(fragmentManager, lifecycle) {


        override fun getItemCount(): Int {
            return 3
        }

        override fun createFragment(position: Int): Fragment {
            return when (position) {
                0 -> ChatFragment()
                1 -> SearchFragment()
                2 -> SettingsFragment()
                else -> ChatFragment()
            }
        }


    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.menu_main, menu)
        super.onCreateOptionsMenu(menu, inflater)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        when (item.itemId) {
            R.id.action_logout -> {
                FirebaseAuth.getInstance().signOut()
                val action = MainFragmentDirections.actionMainFragmentToLoginFragment()
                findNavController().navigate(action)
                return true
            }
        }
        return false
    }
}

AndroidManifest.xml Я использовал NoActionBar

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mml.mig33">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Mig33.NoActionBar">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.Mig33.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

enter image description here

Я тестировал этот код в Mainactivity, и он работает нормально, но он мне нужен на MainFragment.

1
Indiana Evans 2 Июл 2021 в 19:07

3 ответа

Лучший ответ

Я исправил это, изменив android:theme="@style/Theme.Mig33.NoActionBar всего приложения на тему, которая поддерживает панель действий android:theme="@style/Theme.Mig33" и сохранила активность без панели действий

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mml.mig33">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Mig33">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.Mig33.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Называется это во фрагменте

(activity as AppCompatActivity?)!!.setSupportActionBar(binding.toolbar)
0
Indiana Evans 3 Июл 2021 в 05:03

Вы должны установить свою панель инструментов в Основном действии или определить панель инструментов в каждом фрагменте, если вы хотите использовать тему NoActionBar.

Взгляните на https://developer.android.com/guide/navigation/navigation -ui # support_app_bar_variations

1
cryptex 3 Июл 2021 в 05:44

Почему вы используете NoActionBar? Вам необходимо использовать тему , которая поддерживает ActionBar , иначе ваш OnCreateOptionsMenu не будет вызываться. Чтобы добавить панель инструментов, используйте setSupportActionBar(toolbar).

0
Marcelo Filho 2 Июл 2021 в 19:09