如何在android中创建自定义actionbar?

如何在android中创建自定义actionbar?,android,menu,android-actionbar,Android,Menu,Android Actionbar,我想在android中创建自定义actionbar, 这是我的简单代码: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

我想在android中创建自定义actionbar, 这是我的简单代码:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        menubar();
    }

    public void menubar(){

        ActionBar mActionBar = getActionBar();
        LayoutInflater inflater = getLayoutInflater();

        View mCustomView    = inflater.inflate(R.layout.menu_bar, null);
        ImageButton button  = (ImageButton) mCustomView.findViewById(R.id.bt_menu);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(), "Clicked!",Toast.LENGTH_LONG).show();
            }
        });

        mActionBar.setCustomView(mCustomView);
        mActionBar.setDisplayShowCustomEnabled(true);

    }

}
但运行时会显示如下错误:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setCustomView(android.view.View)' on a null object reference
        at dot.com.coba.MainActivity.menubar(MainActivity.java:39)
        at dot.com.coba.MainActivity.onCreate(MainActivity.java:21)
    
您的
getActionBar()
方法返回null,因此请尝试使用
getSupportActionBar()
如下:

ActionBar mActionBar = getSupportActionBar();
首先,请阅读Android开发者的博客帖子。
注意,现在应该使用
工具栏
而不是
操作栏

在这个版本中,Android引入了一个新的工具栏小部件这是一个 动作条模式的泛化,为您提供了更多 控制和灵活性。工具栏是层次结构中的一个视图,就像 任何其他,使其更容易与您的其他系统交叉 查看,设置动画,并对滚动事件做出反应。您也可以设置它 作为您活动的操作栏,意味着您的标准选项菜单 操作将显示在其中

换句话说,
ActionBar
现在变成了一种特殊的
工具栏
。这是一篇文章的摘录

应用程序栏,以前在Android中称为操作栏,是一种特殊的工具栏,用于品牌、导航、搜索和操作


如何在项目中设置工具栏?
1)。
build.gradle
文件中:

compile 'com.android.support:appcompat-v7:22.2.0'
2)。
AppCompatActivity
扩展您的
活动:

public class MyActivity extends AppCompatActivity{
@Override
public void setContentView(int layoutResID) {
    super.setContentView(layoutResID);
    getActionBarToolbar();
}
3)。
活动的类成员身份创建指向
工具栏的链接
,或使用
视图持有者
模式:

public class MyActivity extends AppCompatActivity{
    //Some code

    private Toolbar mActionBarToolbar;

    //Some code
}
4)。
MyActivity

protected Toolbar getActionBarToolbar() {
    if (mActionBarToolbar == null) {
        mActionBarToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
        if (mActionBarToolbar != null) {
            setSupportActionBar(mActionBarToolbar);
        }
    }
    return mActionBarToolbar;
}
5)。覆盖
MyActivity
的方法
setContentView

public class MyActivity extends AppCompatActivity{
@Override
public void setContentView(int layoutResID) {
    super.setContentView(layoutResID);
    getActionBarToolbar();
}
6)。创建文件
res/layout/toolbar\u actionbar.xml

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto"
    myapp:theme="@style/ActionBarThemeOverlay"
    myapp:popupTheme="@style/ActionBarPopupThemeOverlay"
    android:id="@+id/toolbar_actionbar"
    android:background="@null"
    myapp:titleTextAppearance="@style/ActionBar.TitleText"
    android:layout_width="match_parent"
    android:layout_height="?actionBarSize" />
<include layout="@layout/toolbar_actionbar" />

8)。运行项目。

如果要创建自己的操作栏,请隐藏默认的操作栏。把这条线放在你的活动中

getSupportActionBar().hide();
并在Xml文件中创建您自己的布局,就像我在下面创建的一样

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimaryDark"
        android:gravity="center"
        android:orientation="horizontal">


        <ImageButton
            android:id="@+id/ibBack"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_centerVertical="true"
            android:background="@android:color/transparent"
            android:padding="15dp"
            android:src="@drawable/back_1"
            android:visibility="visible" />

        <TextView
            style="?android:textAppearanceLarge"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:padding="10sp"
            android:id="@+id/tvTitle"
            android:text="Activity name"
            android:textColor="@color/whiteColor"
            android:textStyle="normal" />
    </RelativeLayout>
</LinearLayout>

现在,只需将标题设置为您的需求,您就可以在imagebutton click listner中轻松调用backpress事件


听起来很简单!哈

我试着这样做,但无法工作,无法解析方法“getsupportActionBar”
    mContext = mAppCompatActivity.getBaseContext();
    ActionBar mActionBar = mAppCompatActivity.getSupportActionBar();
    ActionBar.LayoutParams mParams = new ActionBar.LayoutParams(
            ActionBar.LayoutParams.MATCH_PARENT,
            ActionBar.LayoutParams.MATCH_PARENT);
    mFrameLayout = new FrameLayout(mContext);
    mFrameLayout.setLayoutParams(mParams);
    if (mActionBar != null) {
        mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        mActionBar.setDisplayShowCustomEnabled(true);
        mActionBar.setDisplayShowTitleEnabled(false);
        mActionBar.setCustomView(mFrameLayout);
        Toolbar mToolbar = (Toolbar) mFrameLayout.getParent();
        mToolbar.setPadding(0, 0, 0, 0);
        mToolbar.setContentInsetsAbsolute(0, 0);
    }