android 5.X Toolbar+DrawerLayout實現抽屜菜單

來源:互聯網
上載者:User

android 5.X Toolbar+DrawerLayout實現抽屜菜單

前言

?android5.X新增的一個控制項Toolbar,這個控制項比ActionBar更加自由,可控,由於以前的ActionBar的靈活性比較差,所以google逐漸使用Toolbar替代ActionBar,所以Toolbar也可以說是超級ActionBar。

這篇文章不詳細介紹ToolBar的使用(定製),主要是介紹Toolbar使用的一個例子,即Toolbar結合DrawerLayout實現抽屜菜單。

使用這個兩個控制項需要引入相應的庫依賴:

dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    compile 'com.android.support:appcompat-v7:23.0.1'    compile 'com.android.support:design:23.0.1'}

1. Toolbar的布局檔案

include_toolbar.xml

Toolbar控制項使用和其他的控制項使用類似,需要注意的是引用v7擴充包中的Toolbar,而不是系統內建的那個Toolbar,這樣可以相容v21以下的裝置。

2. 添加動作菜單

功能表項目通常放在menu檔案夾下的一個xml檔案中

menu_main.xml


   

之前的ActionBar也是需要使用這個菜單檔案來渲染其動作菜單,Toolbar也一樣。

有了菜單布局檔案,還需要在代碼中初始化菜單,這樣Toolbar上面才會顯示這些動作菜單(重寫Activity的onCreateOptionsMenu()方法):

/** * 必須重寫該方法建立菜單,不然菜單不會顯示在Toolbar中 * @param menu * @return */@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    getMenuInflater().inflate(R.menu.menu_main,menu);    return true;}

3. activity主布局檔案

activity_main.xml

                        <framelayout android:id="@+id/fl_containor" android:layout_height="match_parent" android:layout_width="match_parent">        </framelayout>                                                    

4. 代碼初始化Toolbar

 @NonNull private void initToolbar() {     mToolbar = (Toolbar) findViewById(R.id.toolbar);     mToolbar.setLogo(R.mipmap.ic_launcher);     mToolbar.setTitle("主標題");     mToolbar.setSubtitle("副標題");     // ...     // 這個方法很重要,不能少,讓toolbar取代ActionBar     setSupportActionBar(mToolbar); }

注意:一定要調用setSupportActionBar()讓Toolbar取代ActionBar,同時還需要將當前Activity的主題設定為NoActionBar。

5. 將Toolbar與DrawerLayout狀態綁定

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open, R.string.close);drawerToggle.syncState();mDrawerLayout.setDrawerListener(drawerToggle);

6. 初始化內容視圖

private void initContentView() {    Fragment fragment = new ContentFragment();    Bundle bundle = new Bundle();    bundle.putString("title","首頁");    fragment.setArguments(bundle);    mFm.beginTransaction().replace(R.id.fl_containor,fragment).commit();}

ContentFragment.java

package com.example.lt.toolbar;import android.app.ActionBar;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;/** * Created by lt on 2016/3/16. */public class ContentFragment extends Fragment{    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {        TextView textView = new TextView(getActivity());        if(getArguments()!=null){            String title = getArguments().getString("title");            textView.setText(title);            textView.setGravity(Gravity.CENTER);            textView.setLayoutParams(new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));        }        return textView;    }}

7. 初始化抽屜菜單

private void initLeftMenu() { ListView menuList = (ListView) findViewById(R.id.lv_menu); menuList.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1         , new String[]{"首頁","新聞","個人中心"})); menuList.setOnItemClickListener(new AdapterView.OnItemClickListener() {     @Override     public void onItemClick(AdapterView parent, View view, int position, long id) {         Fragment fragment = new ContentFragment();         Bundle bundle = new Bundle();         bundle.putString("title", ((TextView) view).getText().toString());         fragment.setArguments(bundle);         mFm.beginTransaction().replace(R.id.fl_containor, fragment).commit();         mDrawerLayout.closeDrawer(Gravity.LEFT);     } });}

這裡用了一個ListView來渲染抽屜菜單,並設定了當點擊後替換右邊的內容視圖的點擊事件。

完整代碼:

package com.example.lt.toolbar;import android.os.Bundle;import android.support.annotation.NonNull;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.widget.DrawerLayout;import android.support.v7.app.ActionBarDrawerToggle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.Gravity;import android.view.MenuInflater;import android.view.View;import android.view.Menu;import android.view.MenuItem;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    private FragmentManager mFm;    private DrawerLayout mDrawerLayout;    private Toolbar mToolbar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mFm = getSupportFragmentManager();        setContentView(R.layout.activity_main);        initToolbar();        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);        ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open, R.string.close);        drawerToggle.syncState();        mDrawerLayout.setDrawerListener(drawerToggle);        initLeftMenu();        initContentView();    }    @NonNull    private void initToolbar() {        mToolbar = (Toolbar) findViewById(R.id.toolbar);        mToolbar.setLogo(R.mipmap.ic_launcher);        mToolbar.setTitle("主標題");        mToolbar.setSubtitle("副標題");        // 這個方法很重要,不能少,讓toolbar取代ActionBar        setSupportActionBar(mToolbar);    }    private void initContentView() {        Fragment fragment = new ContentFragment();        Bundle bundle = new Bundle();        bundle.putString("title","首頁");        fragment.setArguments(bundle);        mFm.beginTransaction().replace(R.id.fl_containor,fragment).commit();    }    private void initLeftMenu() {        ListView menuList = (ListView) findViewById(R.id.lv_menu);        menuList.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1                , new String[]{"首頁","新聞","個人中心"}));        menuList.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView parent, View view, int position, long id) {                Fragment fragment = new ContentFragment();                Bundle bundle = new Bundle();                bundle.putString("title", ((TextView) view).getText().toString());                fragment.setArguments(bundle);                mFm.beginTransaction().replace(R.id.fl_containor, fragment).commit();                mDrawerLayout.closeDrawer(Gravity.LEFT);            }        });    }    /**     * 必須重寫該方法建立菜單,不然菜單不會顯示在Toolbar中     * @param menu     * @return     */    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.menu_main,menu);        return true;    }}

運行效果示範:

這篇文章就介紹了Toolbar+DrawerLayout實現帶有動畫效果的常見的一種抽屜菜單,Toolbar更多詳細的的用法及樣式定製可以參考官方文檔,也可以參考下面這篇文章,我個人覺得介紹得比較詳細。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.