Androidc学习笔记八之UI及高级开发技巧

2017/3/14  记载
android中UI设计Material Design    android中的序列化  android做context全局工具类    ToolBar


Material Design

1.ToolBar

通过使用item来定义action按钮
app:showAsAction 指定按钮的位置:always表示永远显示,若空间不够则不显示
ifRoom表示空间足够的情况下显示在Toolbar中,不够就显示在菜单中,而never则永远显示在菜单中
AndroidManifest中activity下属性android:label="Fruits"表示指定toolbar的文字内容,没有指定的话
默认使用application中的指定的lable内容,也就是我们的应用名称。
例子:
修改styles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">


toolbar_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:background="?attr/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"/>


</FrameLayout>

在res下新建menu包toolbar.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/backup"
        android:icon="@drawable/ic_launcher"
        android:title="Backip"
        app:showAsAction="always"/>
    <item
        android:id="@+id/delete"
        android:icon="@drawable/ic_launcher"
        android:title="Delete"
        app:showAsAction="ifRoom"/>
    <item
        android:id="@+id/settings"
        android:icon="@drawable/ic_launcher"
        android:title="Settings"
        app:showAsAction="never"/>
</menu>

MainActivity
package com.example.ldp.com.matarialprojecttest;


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {


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


    }


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




    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.backup:
                Toast.makeText(this,"You Click Backeup",Toast.LENGTH_SHORT).show();
                break;
            case R.id.delete:
                Toast.makeText(this,"You Click Delete",Toast.LENGTH_SHORT).show();
                break;
            case R.id.settings:
                Toast.makeText(this,"You Click Settings",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }
}

效果图:
                                       

Android高级应用之技巧篇

一、打造全局Context上下文

有没有发现我们再很多地方都需要调用context,比如踏出Toast,启动互动的时候,发送广播的时候,发送通知服务的时候。
这些地方都需要,而一般情况下只有一个在Activity类下才会有context上下文参数,而我们有很多情况下的逻辑处理又是脱离了Activity活动的,这个时候又应该怎么办呢?
打个比如写一个网络封装类:
                



如果我们想再执行操作之前,检测一下网络,如果网络不存在直接给它一个return,并且Toast提示一下,不就可以减少很多操作了吗?
在这里就要用context,那又该如何做呢?其实APP启动的时候,就提供了一个Application类,会初始化这个类,用于管理程序内的全局通信,比如context
新建一个类继承Application
public class MyApplication extends Application{
	private static Context context;
	@Override
	public void onCreat(){
		context = getApplication();//初始化的时候就获取到Application
		LitePalApplication.initalize(context);
		//避免自己所配置的application和LitePalApplication的冲突
		//不过这个前提是在Application中声明android:name="org.litepal.LitePalApplication"
	}
	
	public static Context getContext(){
		return context;
	}
}

我们需要告知系统,启动时初始化我们新建的这个类,在AndroidManifest.xml中
<application>
	android:name="com......MyApplication"
</application

***在我们需要用到context的地方直接MyApplication.getContext()不就直接获取到全局context了嘛


二、Serializable序列化(Parcelable也可以实现,相对复杂点儿)

intent传递数据的时候,遇到要传递对象怎么办?将对象类序列化serializable就好了,至于什么是序列化百度一下就知道了。开发web的哥们儿都知道滴
intent.putExtra("person_data",person);//这里的person对象已经序列化,

在下一个意图的时候,得到:Person person = (Person)getIntent().getSerializableExtra("person_data");即可


三、定制一个日志工具

做一个日志工具类即可:当我们在上线之前需要打印日志,而上线的时候,如果程序依然在打印日志,就会造成数据泄露,使用直接做的日志开发工具,当上线的时候直接屏蔽就可以
package com.example.ldp.com.matarialprojecttest;


import android.util.Log;


/**
 * Created by Administrator on 2017/3/14.
 */


public class LogUtil {
    public static final int VERBOSE = 1;
    public static final int DEBUG=2;
    public static final int INFO=3;
    public static final int WARN=4;
    public static final int ERROR=5;
    public static final int NOTHING=6;
    public static final int level =VERBOSE;


    public static  void v(String tag,String msg){
        if(level<=VERBOSE){
            Log.v(tag,msg);
        }
    }
    public static  void d(String tag,String msg){
        if(level<=DEBUG){
            Log.d(tag,msg);
        }
    }
    public static  void i(String tag,String msg){
        if(level<=INFO){
            Log.i(tag,msg);
        }
    }
    public static  void w(String tag,String msg){
        if(level<=WARN){
            Log.w(tag,msg);
        }
    }
    public static  void e(String tag,String msg){
        if(level<=ERROR){
            Log.e(tag,msg);
        }
    }
}

让level等于VERBOSE就可以吧所有的日志打印出,而让level等于WARN打印警告以上的日志。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值