Android getActivity().getActionBar()在片段上提供null
我有一个片段,需要动态更改ActionBar的标题。但是当我使用下面的代码时,它给了我Android getActivity().getActionBar()在片段上提供null,android,android-actionbar,Android,Android Actionbar,我有一个片段,需要动态更改ActionBar的标题。但是当我使用下面的代码时,它给了我NullPointerException。这里getActionBar()返回null,我的问题是如何在Fragment类中获取ActionBar的引用。提前感谢你的帮助 片段类代码: public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ActionB
NullPointerException
。这里getActionBar()
返回null,我的问题是如何在Fragment
类中获取ActionBar
的引用。提前感谢你的帮助
片段类代码:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ActionBar mActionBar = getActivity().getActionBar();
mActionBar.setTitle("Your new score is :"+ i);
return rootView;
}
如果您使用的是支持库,请尝试使用
getSupportActionBar()
而不是getActionBar()
我认为最好的解决方案是从您的片段中回调,如下所示:
创建回拨
public interface OnActionBarListener {
void onChangeActionBarTitle(int score);
}
并在您的活动中实施它
public class YourActivity extends AppCompatActivity
implements OnActionBarListener {
@Override
public void onChangeActionBarTitle(int score) {
mActionBar.setTitle("Your new score is :"+ score);
}
}
在你的碎片里
public class YourFragment extends Fragment {
OnActionBarListener mListener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof YourActivity) {
mListener = (OnActionBarListener) context;
}
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (mListener != null) mListener.onChangeActionBarTitle(i);
return rootView;
}
}
Button mButton1;
Button mButton2;
mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
changeTitle(your_score);
}
});
mButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
changeTitle(your_score);
}
});
void changeTitle(int score) {
if (mListener != null) mListener.onChangeActionBarTitle(i);
}
希望这有帮助
更新1:根据您的请求,如果您想让您的活动监听每个按钮,请单击片段,尝试片段中的以下代码
public class YourFragment extends Fragment {
OnActionBarListener mListener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof YourActivity) {
mListener = (OnActionBarListener) context;
}
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (mListener != null) mListener.onChangeActionBarTitle(i);
return rootView;
}
}
Button mButton1;
Button mButton2;
mButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
changeTitle(your_score);
}
});
mButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
changeTitle(your_score);
}
});
void changeTitle(int score) {
if (mListener != null) mListener.onChangeActionBarTitle(i);
}
检查主题是否已将操作栏主题用于此活动 还要检查您是否正在使用AppCompatActivity扩展活动
然后使用getSupportActionBar(),这样问题现在就解决了。我所做的是创建一个接口,并回调我的Activity类。感谢@GianhTran提出的解决方案。它运行良好 以下是我的代码片段: 我的自定义按钮类(UtilOnClickListener.java): //创建了一个接口
public interface OnActionBarListener {
void onChangeActionBarTitle(int score);
}
//在该类的构造函数中初始化它
public class UtilOnClickListener {
public UtilOnClickListener(View view) {
if (Calculator.getContext() instanceof MainActivity) {
mListener = (OnActionBarListener) Calculator.getContext();
}
}
}
下面是MainActivity.java
public class MainActivity extends AppCompatActivity implements UtilOnClickListener.OnActionBarListener {
@Override
public void onChangeActionBarTitle(int score) {
getSupportActionBar().setTitle(Integer.toString(score));
}
}
我已经在用AppCompactActivity扩展我的活动,我正在使用NoActionBar主题,就像我在navigationdrawer中使用它一样。这是我想用我的片段做的,但我需要在单击按钮时更改标题,所以我需要活动在每次单击按钮时进行监听。对于button click,我有另一个自定义类来处理所有的点击事件(不在fragmnet类中)。您能否在此基础上给出一个示例……非常感谢您的帮助。@Paramita我根据
更新了我的答案,因此我需要该活动来监听每个按钮的点击
,但是关于request和button click,我有另一个自定义类,我在其中处理所有的click事件(不在fragmnet类中,我不清楚,你能解释更多吗?嗨,Gianh..我的问题解决了。我尝试在我的自定义按钮单击类中创建一个接口,并按照你的建议回调MainActivity。感谢你的大力帮助..非常感谢。它很有效。太棒了。