Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-在活动中更新工具栏标题,同时使用片段处理向后导航_Java_Android_Android Fragments - Fatal编程技术网

Java Android-在活动中更新工具栏标题,同时使用片段处理向后导航

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(

我有带片段的活动托管幻灯片菜单,当用户单击slidemenu片段中的任何项目时,我需要处理返回导航

当用户单击列表中的项时,我调用此方法来显示适当的片段

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