我创建了一个自定义操作栏,它可以在我的开始活动中正常工作,但是当我从同一个应用程序中的其他活动调用该方法时会出错。
这是我用来在我的第一个活动中设置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);
}
当我从secondAct.java调用actionBarSetup()
时,我得到NullPointerException
在线ActionBar ab = getActionBar()
。
除了主要活动之外,是否不能直接从其他活动调用getActionBar()。 firstAct。
那么如何从其他活动中调用呢?
答案 0 :(得分:2)
您不能通过调用构造函数来创建新活动。您可以为系统创建并打开它们。我正在谈论这条线
(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
表示名称(首字母大写)。
修改强>
警告:您的操作栏可能与您的活动具有不同的样式(例如黑色工具栏和白色活动)。在这种情况下,使用活动的inflater来夸大动作栏的内容将产生不希望的结果(主要是反向文本颜色)。以下行更安全。但它可以在API 14之前下载。
LayoutInflater inflator = LayoutInflater.from(ab.getThemedContext());
答案 1 :(得分:1)
您需要创建类似
的BaseActivitypublic 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()
答案 2 :(得分:1)
这可能会有所帮助
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);
}