我正在启动一个新项目,该项目使用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?这似乎是个糟糕的设计。
如果有人使用com.Android支持:appcompat-v7:和AppCompatActivity作为活动,那么这将起作用
((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);
虽然这个问题已经有了一个公认的答案,但我必须指出它并不完全正确:从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;
}
在片段之后。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()