繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM