簡體   English   中英

Android - 在處理帶片段的導航時更新活動中的工具欄標題

[英]Android - update toolbar title in activity while handle back navigation with fragment

我有Activity托管的帶有片段的幻燈片菜單,當用戶點擊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);
    }

事實上它工作得很好,但我的問題是顯示片段顯示舊標題不顯示新標題

有沒有辦法調用我的方法_frag_title.setText(nav_items[position]);

我的問題不在后面導航,我的問題如何在導航中更新工具欄標題

每當改變你需要做的片段時,改變工具欄的標題。

  1. 必須使用帶有TAG名稱或ID的片段,我將向您展示如何使用TAG名稱(在這種情況下您也可以使用id,您必須更改我的代碼)。

要使用TAG,你必須添加片段TAG,每當你在布局中添加片段時, 讓我們通過TAG添加片段

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方法上添加了BackStackChangedListener

 @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]);

       .......... 
       .......
}

}

你需要在片段的每個片段的恢復時處理這個,以便在片段返回時指定標題。

目前發生的情況是,你在onCreate或實際創建fragment某個地方設置標題,但由於tool bar不是駐留在Activity內的東西(不在Fragment )你必須對其進行具體的更改。 最好的地方是onResume方法的片段。

因此,嘗試在Fragment onResume中設置TextView

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM