Java Android-在活动中更新工具栏标题,同时使用片段处理向后导航
我有带片段的活动托管幻灯片菜单,当用户单击slidemenu片段中的任何项目时,我需要处理返回导航 当用户单击列表中的项时,我调用此方法来显示适当的片段Java Android-在活动中更新工具栏标题,同时使用片段处理向后导航,java,android,android-fragments,Java,Android,Android Fragments,我有带片段的活动托管幻灯片菜单,当用户单击slidemenu片段中的任何项目时,我需要处理返回导航 当用户单击列表中的项时,我调用此方法来显示适当的片段 public void SelectItem(int position) { Fragment _fragment = null; switch (position) { case 0: _fragment = Test_Home.newInstance(
public void SelectItem(int position) {
Fragment _fragment = null;
switch (position) {
case 0:
_fragment = Test_Home.newInstance();
break;
case 1:
_fragment = Diseases_Fragment.newInstance();
break;
........
case 8:
Logout();
break;
default:
break;
}
if (_fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.view_content, _fragment).addToBackStack(null).commit();
// set title , this textview in toolbar
_frag_title.setText(nav_items[position]);
mDrawerLayout.closeDrawer(GravityCompat.START);
}
此方法用于处理后退按钮
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
我的onCreate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home_view);
Toolbar _toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(_toolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
_frag_title = (TextView) _toolbar.findViewById(R.id.frag_title);
}
事实上,它的工作刚刚好,但我的问题是显示片段显示旧标题不显示新标题
是否有方法调用我的方法\u frag\u title.setText(导航项[位置])代码>
我的问题不在返回导航中,我的问题如何在导航中更新工具栏标题您必须在每个片段的简历中处理此问题,以便在返回到片段时指定标题
当前发生的情况是,您正在onCreate
中设置标题,或者在它实际创建片段时的某个地方设置标题,但是由于工具栏
不是驻留在活动
中的内容(不在片段
中),因此您必须对其进行更改。最佳位置是片段的onResume
方法
因此,尝试在您的片段的onResume
中设置文本视图
,以便在您必须按以下方式更改片段时更改工具栏的标题
必须使用带有标记名或按ID的片段,我将向您展示如何使用标记名(您也可以使用按ID,在这种情况下,您必须更改我的代码)
要使用by-TAG,您必须添加fragment标记,每当您在布局中添加fragment时,让我们按标记添加fragment
Fragment fragmentA = new FragmentA();
getFragmentManager().beginTransaction()
.replace(R.id.MainFrameLayout,fragmentA,"YOUR_TARGET_FRAGMENT_TAG")
.addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit();
按照上述方法执行后,在onBackPressed中,使用下面的代码检查您身上的片段
@Override
public void onBackPressed(){
FragmentManager fm = getFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
Log.i("MainActivity", "popping backstack");
fm.popBackStack();
Fragment fragment = getFragmentManager().findFragmentByTag("YOUR_TARGET_FRAGMENT_TAG");
if (fragment instanceof FragmentA) {
// add your code to change title of toolbar
}
} else {
Log.i("MainActivity", "nothing on backstack, calling super");
super.onBackPressed();
}
}
这是我解决这个问题后的一段代码
public void SelectItem(int position) {
Fragment _fragment = null;
switch (position) {
case 0:
_fragment = Test_Home.newInstance();
break;
case 1:
_fragment = Diseases_Fragment.newInstance();
break;
........
.....
case 8:
Logout();
break;
default:
break;
}
if (_fragment != null) {
// I add tag when I add fragment to BackStack
String backStackName = fragment.getClass().getName();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.view_content, fragment, "TARGET_TAG")
.setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.addToBackStack(backStackName)
.commit();
_frag_title.setText(nav_items[position]);
mDrawerLayout.closeDrawer(GravityCompat.START);
}
}
我在onCreate
方法上添加backbackbackchangedListener
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home_view);
......
....
.
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Fragment f = getSupportFragmentManager().findFragmentById(R.id.view_content);
if (f != null) {
updateTitleAndDrawer(f);
}
}
});
}
private void updateTitleAndDrawer(Fragment f) {
String name = f.getClass().getName();
if (name != null) {
ChangeTitle(name);
}
}
private void ChangeTitle(String fragmentName) {
if (fragmentName.equals(Test_Home.class.getName())) {
_frag_title.setText(nav_items[0]);
} else if (fragmentName.equals(Diseases_Fragment.class.getName())) {
_frag_title.setText(nav_items[1]);
} else if (fragmentName.equals(Questions_Fragment.class.getName())) {
_frag_title.setText(nav_items[2]);
..........
.......
}
}
我的问题不是在设置标题,当用户点击回退工具栏时保留旧标题不更新显示片段的问题,让我们考虑它显示标题二与标题二,当用户点击返回它显示片段一但标题仍然two@MinaFawzy你能解决这个问题吗?我想我会找到办法的,但是你的答案是错误的哪一部分是错误的,onResume没有在返回时调用按钮按下了吗?我在工具栏中使用textview可能重复我的问题不在返回导航中,我提供了工作代码,我的问题在更新工具栏标题中。你对不同的片段使用了不同的标题。您想在每次更改片段时更改工具栏上的标题吗?我说的对吗?是的,我现在就更改标题好了,然后检查我的答案如果使用getFragmentManager().beginTransaction().add(R.id.MainFrameLayout,fragmentA,“你的目标片段标记”).addToBackStack(“你的源片段标记”).commit()代码>?因为如果我使用add
方法而不是replace
方法,它不会调用onResume