当前位置: 首页 > 知识库问答 >
问题:

getSupport ActionBar从内部的片段ActionBarCompat

乐寒
2023-03-14

我正在启动一个新项目,该项目使用v7支持库中的AppCompat/ActionBarCompat。我正在尝试弄清楚如何从片段中使用getSupport portActionBar。我托管片段的活动扩展了ActionBarActive,但我没有看到Fragments的类似支持类。

从我的片段中

    public class CrimeFragment extends Fragment {
          //...

          getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment

          //...
    }

使用它的google页面(http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html)表示v4片段不应更改。我是否需要将所有调用强制转换为ActionBarActivity?这似乎是个糟糕的设计。

共有3个答案

陶睿
2023-03-14

如果有人使用com.Android支持:appcompat-v7:和AppCompatActivity作为活动,那么这将起作用

((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);
司寇旺
2023-03-14

虽然这个问题已经有了一个公认的答案,但我必须指出它并不完全正确:从F调用getSupport portActionBar()ragment.onAttach()会导致NullPointerException当活动旋转时。

简短回答:

使用((ActionBarActivity)getActivity())。getSupportActionBar()位于ActivityCreated()(或其生命周期中其后的任何点)中,而不是位于附件()。

长答案:

原因是,如果在旋转后重新创建ActionBar活动,它将在实际创建ActionBar对象之前还原所有片段。

support-v7库中ActionBarActivity的源代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    mImpl = ActionBarActivityDelegate.createDelegate(this);
    super.onCreate(savedInstanceState);
    mImpl.onCreate(savedInstanceState);
}
  • ActionBarActivityDelegate.create委托()根据Android版本创建mImpl对象。
  • super.on创建()FragmentActivity.on创建(),它在旋转后恢复任何先前的片段(FragmentManagerImpl.dispatch创建()

ActionBarActivityDelegate的源代码。getSupportActionBar():

final ActionBar getSupportActionBar() {
    // The Action Bar should be lazily created as mHasActionBar or mOverlayActionBar
    // could change after onCreate
    if (mHasActionBar || mOverlayActionBar) {
        if (mActionBar == null) {
            ... creates the action bar ...
        }
    } else {
        // If we're not set to have a Action Bar, null it just in case it's been set
        mActionBar = null;
    }
    return mActionBar;
}
孙莫希
2023-03-14

在片段之后。onActivityCreated(…)通过getActivity()可以访问有效的活动。

您需要将其强制转换为ActionBarActivity,然后调用getSupportActionBar()。

((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);

你确实需要铸件。这不是糟糕的设计,而是向后兼容。

 类似资料:
  • 我想创建带有PagerView的片段,但运行以下代码会返回一个IllegalStateException: 源代码: IllegalStateException: 进程:com.company.user.blabla,pid:22256 java.lang.illegalstate异常:带有适配器的ViewPager com.company.user.blabla.fragments.homeFr

  • 我想从AlertDialog的setPositiveButton()方法内部的片段调用一个方法,该方法用于返回DialogFragment的对话框,但不能这样做。 我在一个名为Test的类中有doSomething()方法,该类扩展了Fragment。在这个类中,我有一个扩展DialogFragment的内部类。在方法onCreateDialog中,问题就发生在这里。查看代码: 对话片段和片段来自

  • 问题内容: 我有一个使用服务几个片段。每个都是具有以下布局的: 开始活动时,将显示软键盘。为了解决这个问题,我在片段中做了以下操作: 我将传入的参数保存为一种访问主要活动的窗口令牌的方式。这可以正常运行,但是不会打扰到in 的键盘。 最初,我尝试使用膨胀布局代替,即: 但这引发了,大概是因为该片段本身不是活动,并且没有唯一的窗口令牌吗? 是否可以从片段中隐藏软键盘,还是应该在中创建一个方法并从片段

  • 问题内容: 如何从片段(android.support.v4.app.Fragment)中访问ActionBar。我正在使用Android支持库v4和v7。我没有使用Sherlock库。 承载片段的活动是ActionBarActivity。 我已经阅读了Android帮助片段Fragment,它也导致了我getActivity(),但是没有getSupportActionBar()方法。 问题答案

  • 如何从片段(android.support.v4.app.Fragment)中访问ActionBar。我正在使用Android支持库v4和V7。我不会用夏洛克图书馆的。 承载该片段的活动是ActionBarActivity。 我阅读了Android帮助部分的片段,它也引导了我getActivity(),但是没有getSupportActionBar()方法。

  • 我试图从碎片屏幕调用一个活动中的方法。 我有一个名为myMethod()的方法,它位于名为MyActivity的活动中;我有一个片段叫做Screen1Fragment。 我想给我的活动打电话。从Screen1Fragment内部创建myMethod(),但我不确定如何执行此操作。 以前,Screen1Fragment是一个活动,因此我扩展了MyActivity,以便可以直接调用myMethod()