Android 如何对应用程序中的所有活动重用自定义actionbar?
我已经创建了一个自定义操作栏,它在我的开始活动中运行良好,但在同一应用程序中从其他活动调用该方法时出现错误 这是我在第一个活动中用来设置ActionBar的代码 firstAct.javaAndroid 如何对应用程序中的所有活动重用自定义actionbar?,android,Android,我已经创建了一个自定义操作栏,它在我的开始活动中运行良好,但在同一应用程序中从其他活动调用该方法时出现错误 这是我在第一个活动中用来设置ActionBar的代码 firstAct.java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.lay
@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()
。
除了主活动(例如firstAct)之外,getActionBar()不能直接从其他活动调用。
那么如何从其他活动调用它?您不会通过调用它们的构造函数来创建新活动。您可以让系统为您创建并打开它们。我说的是电话线
(新的firstAct()).actionBarSetup(secondAct.this)
你想在这里干什么
您可能希望使所有类都可以访问actionBarSetup
方法,而不仅仅是firstAct
的实例。然后像这样声明它(可能将其移动到实用程序类?):
然后从其他类调用它,如下所示:
firstAct.actionBarSetup(this);
将方法设为静态会将其与资源实例分离。您正在执行第二个活动(上下文
参数),但要求从第一个活动的实例(本质上是this.getActionBar()
)获取操作栏,该操作栏不是由系统设置的(因为您误用了构造函数)
注意:请使用PascalCase
符号表示类名(大写字母)
编辑
警告:操作栏的样式可能与活动不同(例如黑色工具栏和白色活动)。在这种情况下,使用活动的充气器充气操作栏的内容将产生不希望的结果(主要是反转的文本颜色)。下面的线路更安全。但它最快将在API 14发布
LayoutInflater inflator = LayoutInflater.from(ab.getThemedContext());
您需要创建基本活动,如
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);
}
工具栏将是更好的选择,因为ActionBar不受欢迎。您不需要通过调用构造函数来创建新的活动。您可以让系统为您创建并打开它们。我说的是行
(新的firstAct()).actionBarSetup(secondAct.this)
。您想在这里做什么?工具栏与较低的API不兼容@PankajNimgade@EugenPechanec .. 我不明白你在说什么。。。。你能说得更准确些吗@好的,你们可以使用支持v7库的工具栏,这将节省你们很多时间。我同意你们的观点,我只是想把一些API升级一下help@R.K没问题。定义实用工具方法时要小心。即使在定义内部类时,它们也可以而且应该在大多数情况下是静态的。另请参阅我的编辑,它可能对您的用例有用。在您第一次回复后,我也做了同样的事情。。它是有效的。。。。谢谢你的回复!!:)
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);
}