如何将自定义操作栏重用于应用程序中的所有活动?

时间:2015-03-13 11:23:07

标签: android

我创建了一个自定义操作栏,它可以在我的开始活动中正常工作,但是当我从同一个应用程序中的其他活动调用该方法时会出错。

这是我用来在我的第一个活动中设置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。 那么如何从其他活动中调用呢?

3 个答案:

答案 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)

您需要创建类似

的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()

答案 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);

}