繁体   English   中英

更改ActionBar标题与当前片段的更改

[英]Changing the ActionBar title wiith change in the current fragment

我有一个Activity,它有一个android.support.v4.widget.DrawerLayout ,后者又有一个FrameLayoutA Side Menu Fragment 侧边菜单有3个选项。 每个选项都会动态地向FrameLayout添加一个新片段,对片段进行的任何操作都会继续添加更多片段。

例如:如果我选择选项-1,则这是一个5步骤的过程。 让我们说一个测验。 你提交第一个答案,第二个片段出现一个新问题(而前一个问题在后面的堆栈中),依此类推。 最后在问题5结束。选项-2有一个类似的过程,有3个阶段,选项-3也是如此。

我的要求是只要用户可以看到该序列的片段,就将Actionbar标题设置为“Option-1”。

我尝试了什么:

我创建了一个超级片段,每个其他片段都扩展,这个超级片段有一个字段标题 ,我在将它添加到FrameLayout时设置。 并且onBackStackChanged我将使用条目计数得到最顶层的片段并从中获取标题并设置为操作栏标题。

fragmentManager.addOnBackStackChangedListener(new 

    FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            int count = fragmentManager.getBackStackEntryCount();
            Fragment visibleFragment = fragmentManager.getFragments().get(count > 0 ? count - 1 : count);
            Log.d("onBackStackChanged", "" + visibleFragment);
            //actionBar.setTitle(visibleFragment.title);
        }
    });

但问题是,当我看到日志时,它不是可见片段,它出现在visibleFragment字段中,它是随机的。 我的意思是有时甚至我得到SideMenuFragment,它实际上是xml中的静态

有一个简单而更好的方法来做到这一点?

创建一个@Jibbo建议的接口( 文档 ),这是片段和活动应该通信的正确方式(@Hiren Patel所说的不是那种方式,因为片段不能与其他活动重用 - 他使用了公共方法活动)。

您的评论:如何处理后退和标题,您可以覆盖MainActivity中的onBackPressed方法并检查片段TAG,以确定我们按下哪个片段,然后根据此设置标题。

您在启动片段时设置TAG

getSupportFragmentManager()
     .beginTransaction()
     .add(R.id.content_frame, new QuizFragment(), FRAGMENT_TAG_QUIZ)
     .addToBackStack(FRAGMENT_TAG_QUIZ)
     .commit();

检测后退

@Override
public void onBackPressed()
{
    // Check fragment back stack so we can set the right action bar title
    int fragmentCount = fragmentManager.getBackStackEntryCount();
    if (fragmentCount != 0)
    {
        FragmentManager.BackStackEntry backEntry = fragmentManager.getBackStackEntryAt(fragmentCount - 1);
        String fragmentTag = backEntry.getName();

        if (fragmentTag != null)
        {
            // If back pressed when on Quiz
            switch (fragmentTag) {
                case FRAGMENT_TAG_QUIZ:
                   setActionBarTitle("Quiz");
                   break;
                ....
            }
        }
    }

    super.onBackPressed();
}

我会用以下方式做到这一点:

我将创建一个界面,如:

public interface ChangeTitleListener{
    public void setTitle(String title);
}

我会让活动实现它。 然后,在片段中:

private ChangeListener mListener;

@Override
public void OnAttach(Activity activity){
    if(activity instanceof ChangeTitleListener){
        mListener = (ChangeListener) activity;
    }
    else{
        throw new RuntimeException("The activity must implement ChangeListener");
    }
}

现在你可以调用mListener.setTitle(SOMETHING); 什么时候需要 我建议在onResume()方法中调用它,因为它不是一个昂贵的动作,每次显示片段时都需要它。

你可以这样做:

在您的活动中

public void setActionBarTitle(String title) {
    getSupportActionBar().setTitle(title);
}

Fragment设置Actionbar 标题

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    // Set title bar
    ((MainFragmentActivity) getActivity())
            .setActionBarTitle("Your title");

}

希望它会对你有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM