[英]how to reuse custom actionbar to all the activities in an application?
我创建了一个自定义操作栏,该栏在我的启动活动上运行良好,但是当我从同一应用程序中的其他活动调用该方法时却给出了错误。
这是我在第一个活动中用来设置ActionBar的代码
firstAct.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
actionBarSetup(this);
}
void actionBarSetup(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ActionBar ab = getActionBar();
ab.setDisplayShowCustomEnabled(true);
ab.setDisplayShowTitleEnabled(false);
ab.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
LayoutInflater inflator = LayoutInflater.from(context);
View v = inflator.inflate(R.layout.actionbar_layout, null);
//assign the view to the actionbar
ab.setCustomView(v);
}
}
**secondAct.java**
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_pg);
(new firstAct()).actionBarSetup(secondAct.this);
}
当我在ActionBar ab = getActionBar()
行上从secondAct.java调用actionBarSetup actionBarSetup()
时,得到NullPointerException。 是getActionBar()不能直接从除main活动之外的其他活动中调用的原因。 第一幕。 那么如何从其他活动中调用它呢?
您不会通过调用其构造函数来创建新活动。 您已创建系统并为您打开它们。 我在说线
(new firstAct()).actionBarSetup(secondAct.this)
您想在这里做什么?
你可能想使actionBarSetup
所有类只是实例方法访问,而不是firstAct
。 然后像这样声明它(也许将其移至实用程序类?):
public static void actionBarSetup(Activity activity) {
ActionBar ab = activity.getActionBar(); // you need activity, not just context
// ...
}
然后从其他这样的类中调用它:
firstAct.actionBarSetup(this);
将方法设为静态会将其与实例资源分离。 您正在进行第二个活动( context
参数),但是从第一个活动的实例(本质上是this.getActionBar()
)中请求一个操作栏,而该活动栏不是系统设置的(因为您滥用了构造函数)。
注意:请对类名称使用PascalCase
表示法(大写的首字母)。
编辑
警告:操作栏的样式可能与您的活动不同(例如,黑色的工具栏和白色的活动)。 在这种情况下,使用活动的充气机来充气操作栏的内容将产生不良的结果(主要是文本颜色反转)。 下一行比较安全。 但是它最早要到API 14才可用。
LayoutInflater inflator = LayoutInflater.from(ab.getThemedContext());
您需要像这样创建BaseActivity
public class BaseActivity extends Activity {
public void actionBarSetup(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ActionBar ab = getActionBar();
ab.setDisplayShowCustomEnabled(true);
ab.setDisplayShowTitleEnabled(false);
ab.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
LayoutInflater inflator = LayoutInflater.from(context);
View v = inflator.inflate(R.layout.actionbar_layout, null);
//assign the view to the actionbar
ab.setCustomView(v);
}
}
那么您需要firstAct和secondAct扩展BaseActivity,然后在onCreate方法中调用actionBarSetup()
这可能会有所帮助
private void showCustoNavBar(){
getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.new_gradient));
getSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(false);
View customNav = LayoutInflater.from(this).inflate(R.layout.actioncustomview, null);
getSupportActionBar().setCustomView(customNav);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.