1. 程式人生 > >Android Design AppBarLayout、NavigationView、FloatingActionButton、CollapsingToolbarLayout等控制元件的使用

Android Design AppBarLayout、NavigationView、FloatingActionButton、CollapsingToolbarLayout等控制元件的使用

霍霍,把剩下的幾個控制元件給大家整出來了,我是菜鳥,這些內容有很多大神早已經整出來,為什麼還要寫這個部落格呢,主要還是為了鍛鍊自己技術。在自己寫部落格的時候發現不小的問題,最大的問題就是介面醜陋。所以大家多結交結交兩個設計人員吧。奮鬥環境跟第一次搭建環境一樣。先上圖


下來分析介面,上面用了AppBarLayout。和toolbar,看過上一篇文章的都知道,這個是用的Design裡面的TabLayout。大家看右下角的這個按鈕,有沒有很懸的感覺,其實就是一個浮動按鈕FloatingActionButton。然後整個佈局是用CoordinatorLayout包裹起來的。旁邊的這個是什麼呢,NavigationView,看xml程式碼

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    android:id="@+id/a_design_coordinatorlayout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/a_design_appbarlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        >

        <android.support.v7.widget.Toolbar
            android:id="@+id/a_design_toolbar"
            android:layout_width="match_parent"
            app:layout_scrollFlags="scroll|enterAlways"
        android:layout_height="wrap_content">

        </android.support.v7.widget.Toolbar>

        <android.support.design.widget.TabLayout
            android:id="@+id/a_design_tablayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >

        </android.support.design.widget.TabLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/a_design_viewpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >
    </android.support.v4.view.ViewPager>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/a_design_floatingactionbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        app:borderWidth="0dp"
        android:layout_margin="10dp"
        android:src="@mipmap/ic_launcher" />

</android.support.design.widget.CoordinatorLayout>
xml程式碼
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                        xmlns:app="http://schemas.android.com/apk/res-auto"
                                        android:id="@+id/a_design_drawerlayout"
                                        android:layout_width="match_parent"
                                        android:layout_height="match_parent">

    <!--your content-->

    <include layout="@layout/activity_design" />

    <!--the navigation menu-->
    <android.support.design.widget.NavigationView
        android:id="@+id/a_design_navigationview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/layout_header1"
        app:menu="@layout/layout_menu" />


</android.support.v4.widget.DrawerLayout>

再來看看Activity怎麼寫的
package com.xiaomeng.learn;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

/**
 * wei2015/9/7
 */
public class DesginActivity extends AppCompatActivity {

    AppBarLayout mAppBarLayout;
    Toolbar mToolbar;
    TabLayout mTabLayout;
    ViewPager mViewPager;
    CoordinatorLayout mCoordinatorLayout;
    NavigationView mNavigationView;
    DrawerLayout mDrawerLayout;
    FloatingActionButton mFloatingActionButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_designmian);
        initParam();
        initView();
        initAction();
    }

    private void initParam() {
        mAppBarLayout = (AppBarLayout) findViewById(R.id.a_design_appbarlayout);
        mToolbar = (Toolbar) findViewById(R.id.a_design_toolbar);
        mTabLayout = (TabLayout) findViewById(R.id.a_design_tablayout);
        mViewPager = (ViewPager) findViewById(R.id.a_design_viewpager);
        mCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.a_design_coordinatorlayout);
        mNavigationView=(NavigationView)findViewById(R.id.a_design_navigationview);
        mDrawerLayout=(DrawerLayout)findViewById(R.id.a_design_drawerlayout);
        mFloatingActionButton=(FloatingActionButton)findViewById(R.id.a_design_floatingactionbutton);
    }

    private void initView() {
        initToolbar();
    initTabLayout();
    }

    private void initAction() {
    mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {


        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {
            switch (menuItem.getItemId()) {
                case R.id.sub_exit:
                    finish();
                    break;
                case R.id.sub_switch:
                    break;
                case R.id.nav_blog:
                    startActivity(new Intent(DesginActivity.this, TextInputLayoutActivity.class));
                    break;
                case R.id.nav_ver:
                    break;
                case R.id.nav_about:
                    break;
            }
            menuItem.setChecked(true);
           mDrawerLayout.closeDrawers();
            return true;
        }
    });
        mFloatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final Snackbar mSnackbar = Snackbar.make(mFloatingActionButton, "顯示內容", Snackbar
                        .LENGTH_LONG);
                mSnackbar.setText("顯示內容1");
                mSnackbar.setAction("取消", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mSnackbar.dismiss();
                    }
                });
                mSnackbar.show();
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_design, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
        if (id == android.R.id.home) {
            mDrawerLayout.openDrawer(GravityCompat.START);
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onPause() {
        super.onPause();

    }
//設定Toolbar相關的內容
    private void initToolbar() {
        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        mToolbar.setTitle("我的部落格");
        mToolbar.setSubtitle("CSDN");
        mToolbar.setLogo(R.mipmap.ic_launcher);
//        mToolbar.setNavigationIcon(R.mipmap.count_down);
        mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()){
                    case R.id.action_settings:
                        Toast.makeText(DesginActivity.this, "actiong_settings", Toast
                                .LENGTH_SHORT).show();

                        break;
                    case R.id.action_2:
                        Toast.makeText(DesginActivity.this, "action2", Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_1:
                        Toast.makeText(DesginActivity.this, "action1", Toast.LENGTH_SHORT).show();
                        break;
                }
                return false;
            }
        });
    }
//設定相關TabLayout的內容
    private void initTabLayout(){
        List<String> tabList = new ArrayList<>();
        tabList.add("計時器");
        tabList.add("倒計時");
        tabList.add("計數器");
        mTabLayout.setTabMode(TabLayout.MODE_FIXED);//設定tab模式,當前為系統預設模式
        mTabLayout.addTab(mTabLayout.newTab().setText(tabList.get(0)));
        mTabLayout.addTab(mTabLayout.newTab().setText(tabList.get(1)));
        mTabLayout.addTab(mTabLayout.newTab().setText(tabList.get(2)));

        List<Fragment> fragmentList = new ArrayList<>();
        for (int i = 0; i < tabList.size(); i++) {
            Fragment f1 = new Tab1Fragment();
            Bundle bundle = new Bundle();
            bundle.putString("param", "這是第"+(i+1)+"個介面");
            f1.setArguments(bundle);
            fragmentList.add(f1);
        }

        TabFragmentAdapter fragmentAdapter = new TabFragmentAdapter(DesginActivity.this,getSupportFragmentManager(), fragmentList, tabList);
        mViewPager.setAdapter(fragmentAdapter);//給ViewPager設定介面卡
        mTabLayout.setupWithViewPager(mViewPager);//將TabLayout和ViewPager關聯起來。
        mTabLayout.setTabsFromPagerAdapter(fragmentAdapter);//給Tabs設定介面卡
        for (int i=0;i<mTabLayout.getTabCount();i++)
        {
            TabLayout.Tab tab=mTabLayout.getTabAt(i);
            tab.setCustomView(fragmentAdapter.getTabView(i));
        }
    }
}
這兒有點不同的就是TabLayout用了RecyclerView。來看看TabLayout用的到fragment怎麼咋寫的吧

xml程式碼

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
                                        android:id="@+id/recyclerView"
                                        android:layout_width="match_parent"
                                        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>


Fragment程式碼

package com.xiaomeng.learn;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;



import java.util.ArrayList;
import java.util.List;



public class Tab1Fragment extends Fragment {

    private String content;
    private View view;
    private RecyclerView recyclerView;

    private List<ModelBean> beanList;
    private RecyclerAdapter adapter;

    private String des[] = {"春色迷人眼", "美女動人心", "春色迷人眼", "美女動人心", "春色迷人眼"
            , "美女動人心", "春色迷人眼", "美女動人心", "春色迷人眼"};

    private int resId[] = {R.mipmap.fengjing, R.mipmap.girl, R.mipmap.fengjing, R.mipmap.girl,
            R.mipmap.fengjing, R.mipmap.girl, R.mipmap.fengjing, R.mipmap.girl};


    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_tab1, container, false);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        content = getArguments().getString("content");
        recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        initData();
    }


    private void initData() {
        beanList = new ArrayList<>();
        for (int i = 0; i < 8; i++) {
            ModelBean bean = new ModelBean();
            bean.setResId(resId[i]);
            bean.setTitle(des[i]);
            beanList.add(bean);
        }
        adapter = new RecyclerAdapter(getActivity(), beanList);
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(new RecyclerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position, Object object) {
                startActivity(new Intent(getActivity(), CollapsingToolbarActivity.class));
            }
        });
    }
}

這兒還用到一個介面卡
package com.xiaomeng.learn;

import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;


import java.util.List;


public class TabFragmentAdapter extends FragmentPagerAdapter {

    private List<Fragment> mFragments;
    private List<String> mTitles;
    private Context mContext;
    private int[] imageResId = {R.mipmap.count_timer, R.mipmap.count_down, R.mipmap.count_times};

    public TabFragmentAdapter(Context context, FragmentManager fm, List<Fragment> fragments,
                              List<String> titles) {
        super(fm);
        this.mContext = context;
        mFragments = fragments;
        mTitles = titles;
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mTitles.get(position);
    }

    public View getTabView(int position) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.layout_header, null);
        TextView tv = (TextView) view.findViewById(R.id.l_header_tv);
        ImageView iv = (ImageView) view.findViewById(R.id.l_header_iv);
        tv.setText(mTitles.get(position));
        iv.setImageResource(imageResId[position]);
        return view;
    }
}

基本都這樣,然後再來看看CollapsingToolbarLayout


這個功能也不錯,哈哈,先看xml,再看程式碼,灰常簡單

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

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="160dp">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:statusBarScrim="?attr/colorPrimary"

            >

            <ImageView
                android:id="@+id/image"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="fitXY"
                android:src="@mipmap/bg"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.6" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"></android.support.v7.widget.Toolbar>
        </android.support.design.widget.CollapsingToolbarLayout>


    </android.support.design.widget.AppBarLayout>


    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:paddingTop="24dp">

            <include layout="@layout/item_card_view" />

            <include layout="@layout/item_card_view" />

            <include layout="@layout/item_card_view" />

            <include layout="@layout/item_card_view" />

            <include layout="@layout/item_card_view" />

            <include layout="@layout/item_card_view" />

            <include layout="@layout/item_card_view" />

            <include layout="@layout/item_card_view" />

            <include layout="@layout/item_card_view" />

        </LinearLayout>

    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"
        app:backgroundTintMode="multiply"
        app:layout_anchor="@id/appbar"
        app:borderWidth="0dp"
        android:layout_margin="10dp"
        app:layout_anchorGravity="bottom|end|right"></android.support.design.widget.FloatingActionButton>

</android.support.design.widget.CoordinatorLayout>

程式碼:
package com.xiaomeng.learn;

import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class CollapsingToolbarActivity extends AppCompatActivity {

    Toolbar mToolbar;
    CollapsingToolbarLayout mCollapsingToolbarLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_collapsing_toolbar);
        mToolbar =(Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        mCollapsingToolbarLayout =(CollapsingToolbarLayout)findViewById(R.id.collapsing_toolbar);
        mCollapsingToolbarLayout.setTitle("I'm a Title");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_collapsing_toolbar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
基本大概使用的情況就是這樣的了,待會會把程式碼的下載地址發出來,然後看了Design也有不少日子了,為什麼這兒沒重要講裡面的方法,是因為限制挺多的,說白了就是不怎麼特別廣泛的用,但是CollapsingToolbarLayout,FloatingActionButton、TextInputLayout這些限制比較少的還不錯。然後繼續來看看原始碼吧,首先最簡單的FloatingActionButton吧。

原始碼部分分析瞭解:程式碼不多,3oo多行,首先繼承的是ImagView然後再來看看我們使用的public方法有哪些分別是做什麼的。有show()、hide()、setBackgroundDrawable()當然了,既然是繼承自Imageview,那ImagView的方法也是可以使用的了。


這兒有幾個屬性設定,當然了也可以程式碼設定了,一般就是setXXXX(),對不對。其她幾個控制元件的原始碼我也沒去看。現在覺得這控制元件使用限制還是有點多,所以就沒去看。然後再推薦一個大神的帖子。我也是看了他的東西來敲的程式碼。

下載地址:http://download.csdn.net/detail/u011051627/9112127

大神的地址:http://blog.csdn.net/feiduclear_up/article/details/46500865