Android 如何对应用程序中的所有活动重用自定义actionbar?

Android 如何对应用程序中的所有活动重用自定义actionbar?,android,Android,我已经创建了一个自定义操作栏,它在我的开始活动中运行良好,但在同一应用程序中从其他活动调用该方法时出现错误 这是我在第一个活动中用来设置ActionBar的代码 firstAct.java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.lay

我已经创建了一个自定义操作栏,它在我的开始活动中运行良好,但在同一应用程序中从其他活动调用该方法时出现错误

这是我在第一个活动中用来设置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()
。 除了主活动(例如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);

}