扒一扒Android那些常用的布局

作者: Android开发哥 | 来源:发表于2017-03-01 12:18 被阅读323次

通用抽屉布局(DrawerLayout)

效果图

布局

布局文件

新建一个tool_bar.xml

之所以使用另外新建布局文件,是因为考虑到toolbar在很多Activity可能会复用。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar 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="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    app:layout_scrollFlags="enterAlways|scroll">

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

新建一个drawer.xml

新建一个drawer.xml纯属是因为不想把太多代码写在一个布局文件里面。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="this is content" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#fff"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="option1"
            android:text="选项1" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="option2"
            android:text="选项2" />
    </LinearLayout>

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

注意,一个DrawerLayout里面需要有两个ViewGroup,其中带有android:layout_gravity="start"的将会是左边侧滑的菜单。

activity_main.xml

由于上面两个布局都写好了,所以我们就直接包含进来就可以了。

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

    <include
        android:id="@+id/toolbar"
        layout="@layout/tool_bar" />

    <include
        android:id="@+id/drawerLayout"
        layout="@layout/drawer" />
</LinearLayout>

菜单文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:icon="@mipmap/ic_launcher"
        android:title="选项1"
        app:showAsAction="always" />
    <item android:title="选项2" />
    <item android:title="选项3" />
    <item android:title="选项4" />
    <item
        android:title="选项5"
        app:showAsAction="always" />
</menu>

app:showAsAction表示该菜单项会在toolbar上显示

MainActivity.java

public class MainActivity extends AppCompatActivity {

    Toolbar toolbar;
    DrawerLayout drawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
        setupDraerLayuout();
    }

    private void setupDraerLayuout() {
        toolbar.setTitle("");
        toolbar.setTitleTextColor(Color.parseColor("#ffffff"));
        setSupportActionBar(toolbar);
        ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, 0, 0) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                Toast.makeText(MainActivity.this, "close", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                Toast.makeText(MainActivity.this, "open", Toast.LENGTH_SHORT).show();
            }
        };
        drawerToggle.syncState();
        drawerLayout.setDrawerListener(drawerToggle);
    }


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

    public void option1(View v) {
        Intent intent = new Intent();
        intent.setClass(this, ToolbarHideActivity.class);
        startActivity(intent);
    }

    public void option2(View v) {
        Intent intent = new Intent();
        intent.setClass(this, CollaspingLayoutActivity.class);
        startActivity(intent);
    }
}

较为关键的应该就是下面的代码

        ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, 0, 0) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                Toast.makeText(MainActivity.this, "close", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                Toast.makeText(MainActivity.this, "open", Toast.LENGTH_SHORT).show();
            }
        };
        drawerToggle.syncState();
        drawerLayout.setDrawerListener(drawerToggle);

由于ActionBarDrawerToggle自身实现DrawerLayout.DrawerListener接口,所以我们只需要重写他的一些接口方法,就可以直接设置为drawerLayout的监听器了。

导航抽屉布局(DrawerLayout)

效果图

布局

这种布局跟上面的布局差不多,只是左边的侧滑栏改变了。我们不使用普通的LinearLayout,而是使用NavigationView代替。这让我们的代码更加地优雅。

所以我们只需要在上面的代码作修改

activity_main_drawer.xml

左边的选项是通过菜单的形式展示的

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/option1"
            android:icon="@mipmap/ic_launcher"
            android:title="选项1" />
        <item
            android:id="@+id/option2"
            android:icon="@mipmap/ic_launcher"
            android:title="选项2" />
    </group>

    <item android:title="分组2">
        <menu>
            <item
                android:id="@+id/option3"
                android:icon="@mipmap/ic_launcher"
                android:title="选项3" />
            <item
                android:id="@+id/option4"
                android:icon="@mipmap/ic_launcher"
                android:title="选项4" />
        </menu>
    </item>


</menu>

drawer.xml

我们只需要把原来的LinearLyaout改成NavigationView就可以了。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="this is content" />
    </LinearLayout>

  
    <android.support.design.widget.NavigationView
        android:id="@+id/nav"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/activity_main_drawer"></android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

MainActivity.java

至于代码,差不多就只有设置菜单点击事件的代码了

navigationView.setNavigationItemSelectedListener(this);

可选

因为我们的效果是带有图片的,这一步可以为左边的侧滑栏添加headerView

header_view.xml

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

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@mipmap/header" />

</LinearLayout>

MainActivity.java

NavigationView navigationView = (NavigationView) findViewById(R.id.nav);
        navigationView.addHeaderView(getLayoutInflater().inflate(R.layout.header_view, null, false));

上述代码就可以为NavigationView添加一个headerView了。

普通Toolbar自动隐藏布局(视差滚动视图)

效果图

布局布局

这是纯布局的代码,那就直接上代码了。

布局

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

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize">

        <include
            android:id="@+id/toolbar"
            layout="@layout/tool_bar" />

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

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/text" />

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

ToolbarHideActivity.java

public class ToolbarHideActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_toolbar_hide);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle("新闻");
        setSupportActionBar(toolbar);
    }
}

带图片的Toolbar自动隐藏布局(视差滚动视图)

效果图

布局布局

这个基本也都是纯布局的代码

activity_collapsing_layout.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:id="@+id/rootView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:theme="@style/ThemeOverlay.AppCompat.Dark">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                android:src="@mipmap/header"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.7" />

            <include layout="@layout/tool_bar" />
        </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">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@string/text" />

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

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fac"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:elevation="6dp"
        android:src="@mipmap/ic_launcher"
        app:backgroundTint="@color/colorPrimary"
        app:layout_anchor="@id/toolbar_layout"
        app:layout_anchorGravity="bottom|center"
        app:pressedTranslationZ="16dp"
        app:rippleColor="@color/colorPrimaryDark" />


</android.support.design.widget.CoordinatorLayout>
  • app:layout_scrollFlags

    • scroll: 当滚动的时候开始移出屏幕
    • enterAlways: 一旦向上滚动这个view就可见。
    • enterAlwaysCollapsed: 顾名思义,这个flag定义的是何时进入(已经消失之后何时再次显示)。假设你定义了一个最小高度(minHeight)同时enterAlways也定义了,那么view将在到达这个最小高度的时候开始显示,并且从这个时候开始慢慢展开,当滚动到顶部的时候展开完。
    • exitUntilCollapsed: 同样顾名思义,这个flag时定义何时退出,当你定义了一个minHeight,这个view将在滚动到达这个最小高度的时候消失。
  • app:contentScrim: 当内容收起来的时候,显示的背景颜色。

  • appbar_scrolling_view_behavior: 改字符串其实是一个class的完成名字,可以直接被使用。这个Behavior的class是真正控制滚动时候View的滚动行为.我们也可以继承Behavior这个class去实现特有的滚动行为.

CollapsingLayoutActivity.java

public class CollapsingLayoutActivity extends AppCompatActivity{


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_collapsing_layout);
        setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
    }
}

相关文章

  • 扒一扒Android那些常用的布局

    通用抽屉布局(DrawerLayout) 效果图 布局文件 新建一个tool_bar.xml 之所以使用另外新建布...

  • 扒一扒那些瓜

    说来惭愧,为了“吃瓜”,我请了一周事假,该事件却无疾而终。 最近关于林生病(接下来会以“双木”称呼他)的热搜已经被...

  • 扒一扒纸尿裤那些事儿

    纸尿裤是现代每个妈妈们带娃的必备神器。每家每户都少不得要用的。那么如何选择性价比最合适的纸尿裤呢。哪些途径购...

  • 扒一扒君臣那些事儿

    周威烈王二十三年(公元前403年),韩、赵、魏三家大夫瓜分晋权,请封诸侯国。三家又以魏为大,国君魏斯,封魏文侯。 ...

  • 扒一扒用过的那些粉饼~

    先说一下~~楼楼的皮肤就是传说中的整体偏干【秋冬容易爆皮,带妆时间长了也容易爆皮】但是T区会出油那种,然后鼻子两侧...

  • 扒一扒跑步的那些装备

    有刚刚准备开始练习跑步的朋友问过我跑步装备的问题,其实我一开始跑步的时候除了有双好点的跑鞋,本身没有什么特别好的装...

  • 扒一扒埃及的那些神

    打开《埃及四千年》,从头到尾,除了陵墓(包括金字塔)就是神庙,博物馆里的收藏精品,出处不是陵墓就是神庙。 上坟的事...

  • 扒一扒那些所谓的优惠

    随着互联网的发展,电商平台的崛起,又因为一些特定节日的出现,“优惠”这词一次次的出现在我们的视野中,但是大多数时候...

  • 扒一扒那些年的随笔

    以前没什么感觉后来发现哦,今天无意间翻了下我的便签,发现里面有很多奇奇怪怪的东西。 不得不说,有点东西!!! 看到...

  • 你为什么画不像?画像画好的诀窍~

    今天以大黄蜂的绘画过程为例,给大家讲一讲精微刻画的过程和绘画常用的一些技巧。顺便扒一扒写实素描那些事~ 精微刻画的...

网友评论

    本文标题:扒一扒Android那些常用的布局

    本文链接:https://www.haomeiwen.com/subject/cuiowttx.html