gpt4 book ai didi

android - 如何使用导航架构组件在应用栏中设置标题

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:14 25 4
gpt4 key购买 nike

我正在试用导航架构组件,但现在在设置标题时遇到了困难。如何以编程方式设置标题及其工作原理?

为了澄清我的问题,让我们举个例子,我设置了一个简单的应用程序,其中 MainActivity 托管导航主机 Controller ,MainFragment 有一个按钮点击按钮,它会转到 DetailFragment

来自 multiple app bars 的另一个问题的相同代码关于堆栈溢出。

主 Activity

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

// Setting up a back button
NavController navController = Navigation.findNavController(this, R.id.nav_host);
NavigationUI.setupActionBarWithNavController(this, navController);
}

@Override
public boolean onSupportNavigateUp() {
return Navigation.findNavController(this, R.id.nav_host).navigateUp();
}
}

主 fragment

public class MainFragment extends Fragment {

public MainFragment() {
// Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_main, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Button buttonOne = view.findViewById(R.id.button_one);
buttonOne.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.detailFragment));
}

}

细节 fragment

public class DetailFragment extends Fragment {

public DetailFragment() {
// Required empty public constructor
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_detail, container, false);
}
}

activity_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:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
tools:context=".MainActivity">

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

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

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

<fragment
android:id="@+id/nav_host"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top"
android:layout_marginTop="?android:attr/actionBarSize"
app:defaultNavHost="true"
app:layout_anchor="@id/bottom_appbar"
app:layout_anchorGravity="top"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:navGraph="@navigation/mobile_navigation" />

<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottom_appbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:layout_gravity="bottom" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_anchor="@id/bottom_appbar" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

navigation.xml

<navigation 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/mobile_navigation"
app:startDestination="@id/mainFragment">
<fragment
android:id="@+id/mainFragment"
android:name="com.example.MainFragment"
android:label="fragment_main"
tools:layout="@layout/fragment_main" >
<action
android:id="@+id/toAccountFragment"
app:destination="@id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name="com.example.DetailFragment"
android:label="fragment_account"
tools:layout="@layout/fragment_detail" />
</navigation>

所以当启动我的应用程序时,标题是“MainActivity”。与往常一样,它显示包含转到 DetailFragment 的按钮的 MainFragment。在 DialogFragment 中,我将标题设置为:

getActivity().getSupportActionBar().setTitle("Detail");

第一个问题:所以单击MainFragment 上的按钮转到DetailFragment,它确实转到了那里并且标题更改为“Detail” .但是在单击后退按钮时,标题会更改为“fragment_main”。所以我将这行代码添加到MainFragment:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// ...

//Showing the title
Navigation.findNavController(view)
.getCurrentDestination().setLabel("Hello");
}

现在,当从 DetailFragment 返回到 MainFragment 时,标题变为“Hello”。但是第二个问题来了,当我关闭应用程序并重新启动时,标题变回“MainActivity”,但它应该显示“Hello”,知道吗?

好的,然后在 MainFrgment 中添加 setTitle("Hello") 也不起作用。例如,Activity 开始并且标题为“Hello”,转到 DetailsFragment 并再次按下后退按钮,标题返回到“fragment_main”。

唯一的解决方案是在MainFragment.

那么使用导航组件显示 fragment 标题的正确方法是什么?

最佳答案

其实是因为:

android:label="fragment_main"

你已经在 xml 中设置了。

So what is the proper way to show the title for Fragments using Navigation Component?

setTitle() 在此时起作用。但是,因为您为那些 Fragment 设置了标签,它可能会在重新创建 Activity 时再次显示该标签。解决方案可能是删除 android:label 然后用代码做你的事情:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("your title");

或者:

((AppCompatActivity) getActivity()).getSupportActionBar().setSubtitle("your subtitle");

onCreateView() 中。


找到解决方法:

interface TempToolbarTitleListener {
fun updateTitle(title: String)
}

class MainActivity : AppCompatActivity(), TempToolbarTitleListener {

...

override fun updateTitle(title: String) {
binding.toolbar.title = title
}
}

然后:

(activity as TempToolbarTitleListener).updateTitle("custom title")

也检查一下:Dynamic ActionBar title from a Fragment using AndroidX Navigation

关于android - 如何使用导航架构组件在应用栏中设置标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52511136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com