当前位置: 首页 > news >正文

Material Design 控件

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Material Design 新控件

SwipeRefreshLayout

只能包含一个子View,setOnRefreshListener设置下拉刷新监听

问题:以下布局会出现下拉和列表滑动冲突问题

<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/sr_show"
android:layout_width="match_parent"
android:layout_height="match_parent">

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

		<android.support.v7.widget.RecyclerView
			android:id="@+id/rv_show"
			android:background="@color/white"
			android:layout_width="match_parent"
			android:layout_height="match_parent">

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

		<RelativeLayout
			android:layout_width="match_parent"
			android:layout_height="match_parent"
			android:background="@color/white"
			android:orientation="vertical">
		<ImageView
			android:id="@+id/iv_empty"
			android:layout_width="120dp"
			android:layout_height="175dp"
			android:layout_gravity="center_horizontal"
			android:contentDescription="@string/app_name"
			android:scaleType="centerCrop"
			android:layout_centerInParent="true"
			android:src="@drawable/img_empty" />
		</RelativeLayout>
	</RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout>

解决:

rvShow.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            if(rvShow.getChildCount() > 0 && rvShow.getChildAt(0).getTop() == 0){
                srShow.setEnabled(true);
            }else{
                srShow.setEnabled(false);
            }
        }
    });

参考:

https://stackoverflow.com/questions/26295481/android-swiperefreshlayout-how-to-implement-canchildscrollup-if-child-is-not-a-l/26296897#26296897 https://developer.android.com/samples/SwipeRefreshMultipleViews/src/com.example.android.swiperefreshmultipleviews/MultiSwipeRefreshLayout.html#l88

TextInputLayout

依赖:compile 'com.android.support:design:22.2.0'

 compile 'com.android.support:appcompat-v7:22.2.0'

使用TextInputLayout创建一个登陆界面:

http://www.jcodecraeer.com/a/basictutorial/2015/0821/3338.html

AutoCompleteTextView

AutoCompleteTextView 简单用法 :

http://blog.csdn.net/i_lovefish/article/details/17337999

DrawerLayout

位置:android-support-v4.jar

布局文件layout_drawer.xml

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

    <!--主布局-->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/content_frame">
        </FrameLayout>
    </RelativeLayout>

    <!--侧滑Drawer-->
    <LinearLayout
        android:id="@+id/menu_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:background="[@android](http://my.oschina.net/asia):color/white"
        >
        <ListView
            android:id="@+id/list_drawer"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"/>
    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

java代码

DrawerLayout drawer_layout = (DrawerLayout) findViewById(R.id.drawer_layout);
LinearLayout menu_frame = (LinearLayout) findViewById(R.id.menu_frame);
ListView list_drawer = (ListView) findViewById(R.id.list_drawer);
//左侧Drawer设置内容
mPlanetTitles = new String[]{"菜单1","菜单2","菜单3"};
list_drawer.setAdapter(new ArrayAdapter<String>(MainActivity.this,
        android.R.layout.simple_expandable_list_item_1, mPlanetTitles));
list_drawer.setOnItemClickListener(new MyOnItemClickListener());
//主界面内容替换
MainFragment mainFragment = new MainFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_frame, mainFragment, "main");
fragmentTransaction.commit();

//监听左侧Drawer点击事件
toggle = new MyActionBarDrawerToggle(MainActivity.this,
            drawer_layout, toolbar, R.string.drawer_open, R.string.drawer_close);
toggle.syncState();  //实现左上角图标状态切换
drawer_layout.setDrawerListener(toggle);

 private class MyActionBarDrawerToggle extends ActionBarDrawerToggle {
    public MyActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar,int openDrawerContentDescRes, int closeDrawerContentDescRes) {
        super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes);
    }
    @Override
    public void onDrawerClosed(View drawerView) {Log.d(TAG,"closed");}
    @Override
    public void onDrawerOpened(View drawerView) {Log.d(TAG, "Opened");}
    @Override
    public void onDrawerStateChanged(int newState) {Log.d(TAG, "StateChanged");}
}

Toolbar

位置: compile "com.android.support:appcompat-v7:23.2.1"

布局文件

1、主题文件中取消ActionBar 

<!-- 使用 API Level 22 编译的话,要拿掉前綴android -->
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>

2、布局文件中设置

<?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:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true"
    android:minHeight="?attr/actionBarSize"
    android:elevation="10dp">
</android.support.v7.widget.Toolbar>

3、res/menu/menu_main.xml中设置菜单

<?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:id="@+id/action_search"
        android:title="搜尋"
        android:icon="@android:drawable/ic_menu_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_refresh"
        android:title="更新"
        android:icon="@android:drawable/ic_menu_rotate"
        app:showAsAction="withText|ifRoom" />
    <item
        android:id="@+id/action_settings"
        android:title="设置"
        app:showAsAction="never" />
</menu>

java代码

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Toolbar标题");
setSupportActionBar(toolbar);
//此后获取Toolbar
ActionBar bar = getSupportActionBar();
bar.setDisplayHomeAsUpEnabled(true);  //打开up button

//建立菜单
  @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    setSearch(menu);
    return true;
}
//对选中的菜单进行操作
 @Override
public boolean onOptionsItemSelected(MenuItem item) {

    if(toggle.onOptionsItemSelected(item)) {
        Log.d(TAG, "logo==========");
        return true;
    }

    switch (item.getItemId()) {
        case android.R.id.home:
            Log.d(TAG, "0000000");
            MainActivity.this.finish();
            break;
        case R.id.action_refresh:
            Toast.makeText(this, "Refresh", Toast.LENGTH_SHORT).show();
            return true;
        case R.id.action_search:
            Toast.makeText(this, "search", Toast.LENGTH_SHORT).show();
            return true;
        default:
    }
    return false;
}

//为ActionBar实现查询功能

private void setSearch(Menu menu) {
    final MenuItem item = menu.findItem(R.id.action_search);
    SearchView sv = (SearchView) MenuItemCompat.getActionView(item);
    if(sv != null){
        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String arg0) {
                Toast.makeText(MainActivity.this, arg0, Toast.LENGTH_SHORT).show();
                MenuItemCompat.collapseActionView(item);
                return true;
            }
            @Override
            public boolean onQueryTextChange(String arg0) {
                return false;
            }
        });
    }
}

其他

自定义toolbar内容布局

Toolbar toolbar = (Toolbar) findViewById(R.id.sc_sub_toolbar);
if (toolbar != null) {
	toolbar.setTitle("");
}
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
	LayoutInflater mInflater = LayoutInflater.from(actionBar.getThemedContext());
	View mCustomView = mInflater.inflate(R.layout.sc_title_bar, null);
	ActionBar.LayoutParams params = new ActionBar.LayoutParams(
				ActionBar.LayoutParams.MATCH_PARENT,
				ActionBar.LayoutParams.MATCH_PARENT);

	actionBar.setCustomView(mCustomView, params); // 全局
	actionBar.setDisplayShowCustomEnabled(true); // 显示自定义视图
}

默认toolbar左边会有padding,可以设置contentInsetStart去掉

<android.support.v7.widget.Toolbar
	android:id="@+id/sc_sub_toolbar"
	android:layout_width="match_parent"
	android:layout_height="@dimen/main_toolbar_height"
	app:contentInsetStart="0dp"
	>
</android.support.v7.widget.Toolbar>

参见:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2006.html

CollapsingToolbarLayout

用于可以折叠的Toolbar,继承至FrameLayout。

设置:

1、CoordinatorLayout作为主布局容器(位置compile 'com.android.support:design:22.2.1')

2、将AppBarLayout布局中的控件用CollapsingToolbarLayout包裹

3、设置CollapsingToolbarLayout布局属性:app:layout_scrollFlags="scroll|exitUntilCollapsed" 它可以控制包含在CollapsingToolbarLayout中的控件(如:ImageView、Toolbar)在响应layout_behavior事件时作出相应的scrollFlags滚动事件(移除屏幕或固定在屏幕顶端)。

4、将要滚动的的view设置属性app:layout_collapseMode="parallax"

5、设置Toolbar的属性,app:layout_collapseMode="pin"和android:layout_height="?attr/actionBarSize"

6、在触发(滚动)事件的view之上设置app:layout_behavior="@string/appbar_scrolling_view_behavior"

参见:

  • Android CollapsingToolbarLayout使用介绍

    https://blog.csdn.net/u013651026/article/details/78959570

  • CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout之间的关系详解

    https://blog.csdn.net/xiatiandefeiyu/article/details/78226544

  • CollapsingToolbarLayout效果实现原理讲解

    https://blog.csdn.net/xiatiandefeiyu/article/details/78476901

  • 关于CoordinatorLayout与Behavior的一点分析: http://www.jianshu.com/p/a506ee4afecb#

Behavior

  • Android CoordinatorLayout之自定义Behavior

    https://www.jianshu.com/p/b987fad8fcb4

  • Android CoordinatorLayout与Behavior使用指南

    https://www.jianshu.com/p/488283f74e69

  • CoordinatorLayout 自定义Behavior并不难

    https://blog.csdn.net/xy51711/article/details/53269576

TabLayout

位置:compile "com.android.support:design:23.2.1"

布局文件

<android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        app:tabIndicatorColor="@color/colorAccent"
        app:tabSelectedTextColor="@android:color/darker_gray"
        app:tabTextColor="@android:color/white"
        >
</android.support.design.widget.TabLayout>

java代码

TabLayout tabLayout = (TabLayout) this.findViewById(R.id.tabLayout);
tabLayout.addTab(tabLayout.newTab().setText("Tab 1").setIcon(R.drawable.ic_home1));
tabLayout.addTab(tabLayout.newTab().setText("Tab 2").setIcon(R.drawable.ic_home2));
tabLayout.addTab(tabLayout.newTab().setText("Tab 3").setIcon(R.drawable.ic_home3));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
// 改变选中tab图片颜色
final int tabIconColorSelect = ContextCompat.getColor(MainActivity.this, R.color.green);
final int tabIconColor = ContextCompat.getColor(MainActivity.this, R.color.black);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            tab.getIcon().setColorFilter(tabIconColorSelect, PorterDuff.Mode.SRC_IN);

        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            tab.getIcon().setColorFilter(tabIconColor, PorterDuff.Mode.SRC_IN);
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });

AppBarLayout

它的作用是把AppBarLayout包裹的内容作为一个整体,组成AppBar

FloatingActionButton

 <android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/ic_launcher"
    app:layout_anchor="@id/drawer_layout"
    app:layout_anchorGravity="bottom|end"
    android:layout_margin="16dp"
    app:backgroundTint="#FF87FFEB"
    app:rippleColor="#33728DFF"
    app:elevation="5dp"
    app:pressedTranslationZ="12dp"
    app:layout_behavior="com.egrid.materialdemo.ScrollAwareFABBehavior"
    />

public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {

	private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator();
	private boolean mIsAnimatingOut = false;

	public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {
		super();
	}

	@Override
	public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,
									   final View directTargetChild, final View target, final int nestedScrollAxes) {
		// Ensure we react to vertical scrolling
		return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL
				|| super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
	}

	@Override
	public void onNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,
							   final View target, final int dxConsumed, final int dyConsumed,
							   final int dxUnconsumed, final int dyUnconsumed) {
		super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
		if (dyConsumed > 0 && !this.mIsAnimatingOut && child.getVisibility() == View.VISIBLE) {
			// User scrolled down and the FAB is currently visible -> hide the FAB
//			animateOut(child);
			child.hide();
		} else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) {
			// User scrolled up and the FAB is currently not visible -> show the FAB
//			animateIn(child);
			child.show();
		}
	}
}

参见:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0718/3197.html

RecyclerView

http://blog.csdn.net/lmj623565791/article/details/45059587

CardView

Palette

Snackbar

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar snackbar = Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Snackbar.make(v, "ActionClick", Snackbar.LENGTH_LONG)
                                    .setActionTextColor(MainActivity.this.getResources().getColor(R.color.colorTest)).show();
                        }
                    }).setActionTextColor(ContextCompat.getColor(MainActivity.this, R.color.colorTest));
            //设置文本颜色(snackbar_text是文本id,snackbar_action是Action的id,都是TextView控件)
            View view1 = snackbar.getView();
            ((TextView)view1.findViewById(R.id.snackbar_text)).setTextColor(Color.parseColor("#FF00FF"));
            snackbar.show();
        }
    });

转载于:https://my.oschina.net/u/2501904/blog/645691

相关文章:

  • ARCproject中加入非ARC文件,或者非ARC环境中加入ARC文件
  • IOS开发UI篇--IOS动画(Core Animation)总结
  • css中的单位
  • 关于退运美国转基因玉米含有MRI 162转基因成分的质疑
  • Shiro基于组织机构的登录验证
  • maven部署构建到私服
  • Android 发送短信总结
  • 笔记 - 10.4、HTML - CSS滤镜笔记
  • Java BigDecimal详解
  • javap的使用
  • java面向对象中的方法重载与方法重写的区别
  • Hadoop2.7实战v1.0之Hive-2.0.0+MySQL本地模式安装
  • 封装常用的Javascript跨浏览器方法
  • 如何安装linux系统
  • linux系统优化脚本实现
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • .pyc 想到的一些问题
  • CSS实用技巧干货
  • HTML中设置input等文本框为不可操作
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Iterator 和 for...of 循环
  • node和express搭建代理服务器(源码)
  • TypeScript迭代器
  • vagrant 添加本地 box 安装 laravel homestead
  • 仿天猫超市收藏抛物线动画工具库
  • 前端临床手札——文件上传
  • 如何在GitHub上创建个人博客
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 用 Swift 编写面向协议的视图
  • 通过调用文摘列表API获取文摘
  • #pragma once与条件编译
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $.each()与$(selector).each()
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (LeetCode C++)盛最多水的容器
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (论文阅读40-45)图像描述1
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (推荐)叮当——中文语音对话机器人
  • (转)Sql Server 保留几位小数的两种做法
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)详解PHP处理密码的几种方式
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .chm格式文件如何阅读
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .gitignore文件---让git自动忽略指定文件
  • .NET 解决重复提交问题
  • @Bean注解详解
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [1]-基于图搜索的路径规划基础
  • [100天算法】-实现 strStr()(day 52)