2015/9/9-2

Android中的Animation的使用

原文链接:http://txlong-onz.iteye.com/blog/965727

透明度控制动画效果 alpha的xml

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
    <alpha   
        android:fromAlpha="0.2"   
        android:toAlpha="1.0"  
        android:duration="3000" />  
    <!-- 透明度控制动画效果 alpha 浮点型值:fromAlpha 属性为动画起始时透明度 toAlpha 属性为动画结束时透明度 说明:0.0表示完全透明 1.0表示完全不透明 以上值取0.0-1.0之间的float数据类型的数字 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 -->  
</set>  

rotate 旋转动画效果的xml

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
    <rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
        android:fromDegrees="0"   
        android:toDegrees="+360"   
        android:pivotX="50%"  
        android:pivotY="50%"   
        android:duration="3000" />  
    <!-- rotate 旋转动画效果 属性:interpolator 指定一个动画的插入器 在我试验过程中,使用android.res.anim中的资源时候发现有三种动画插入器 accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 浮点数型值: fromDegrees 属性为动画起始时物件的角度 toDegrees 属性为动画结束时物件旋转的角度 可以大于360度 说明: 当角度为负数——表示逆时针旋转 当角度为正数——表示顺时针旋转 (负数from——to正数:顺时针旋转) (负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转) pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 说明: 以上两个属性值 从0%-100%中取值 50%为物件的X或Y方向坐标上的中点位置 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 -->  
</set> 

尺寸伸缩动画效果 scale的xml

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
    <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
        android:fromXScale="0.0"   
        android:toXScale="1.4"   
        android:fromYScale="0.0"  
        android:toYScale="1.4"   
        android:pivotX="50%"   
        android:pivotY="50%"  
        android:fillAfter="true"   
        android:duration="700" />  
    <!-- 尺寸伸缩动画效果 scale 属性:interpolator 指定一个动画的插入器 在我试验过程中,使用android.res.anim中的资源时候发现有三种动画插入器 accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 其他的属于特定的动画效果 浮点型值: fromXScale 属性为动画起始时 X坐标上的伸缩尺寸 toXScale 属性为动画结束时 X坐标上的伸缩尺寸 fromYScale 属性为动画起始时Y坐标上的伸缩尺寸 toYScale 属性为动画结束时Y坐标上的伸缩尺寸 说明: 以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 说明: 以上两个属性值 从0%-100%中取值 50%为物件的X或Y方向坐标上的中点位置 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 布尔型值: fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用 -->  
</set>  

translate 位置转移动画效果的xml

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
    <translate   
        android:fromXDelta="30"   
        android:toXDelta="-80"  
        android:fromYDelta="30"   
        android:toYDelta="300"   
        android:duration="2000" />  
    <!-- translate 位置转移动画效果 整型值: fromXDelta 属性为动画起始时 X坐标上的位置 toXDelta 属性为动画结束时X坐标上的位置 fromYDelta 属性为动画起始时 Y坐标上的位置 toYDelta 属性为动画结束时 Y坐标上的位置 注意: 没有指定fromXType toXType fromYType toYType 时候,默认是以自己为相对参照物 长整型值: duration 属性为动画持续时间 说明: 时间以毫秒为单位 -->  
</set>  

MainActivity的调用

public class myActionAnimation extends Activity implements OnClickListener {  
private Button button_alpha;  
private Button button_scale;  
private Button button_translate;  
private Button button_rotate;  
private Animation myAnimation_Alpha;  
private Animation myAnimation_Scale;  
private Animation myAnimation_Translate;  
private Animation myAnimation_Rotate;  
@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main);  

    button_alpha = (Button) findViewById(R.id.button_Alpha);  
    button_alpha.setOnClickListener(this);  

    button_scale = (Button) findViewById(R.id.button_Scale);  
    button_scale.setOnClickListener(this);  

    button_translate = (Button) findViewById(R.id.button_Translate);  
    button_translate.setOnClickListener(this);  

    button_rotate = (Button) findViewById(R.id.button_Rotate);  
    button_rotate.setOnClickListener(this);  
}  
public void onClick(View button) {  
    switch (button.getId()) {  
    case R.id.button_Alpha: {  
        myAnimation_Alpha = AnimationUtils.loadAnimation(this,R.anim.my_alpha_action);  
        button_alpha.startAnimation(myAnimation_Alpha);  
    }  
        break;  
    case R.id.button_Scale: {  
        myAnimation_Scale= AnimationUtils.loadAnimation(this,R.anim.my_scale_action);  
        button_scale.startAnimation(myAnimation_Scale);  
    }  
        break;  
    case R.id.button_Translate: {  
        myAnimation_Translate= AnimationUtils.loadAnimation(this,R.anim.my_translate_action);  
        button_translate.startAnimation(myAnimation_Translate);  
    }  
        break;  
    case R.id.button_Rotate: {  
        myAnimation_Rotate= AnimationUtils.loadAnimation(this,R.anim.my_rotate_action);  
        button_rotate.startAnimation(myAnimation_Rotate);  
    }  
        break;  

    default:  
        break;  
    }  
}  
}  

还用另外一个调用方法

activity.overridePendingTransition(R.anim.in_from_right,
            R.anim.out_to_left);

2015/9/7

2015/9/7问题集

理解 Android Build 系统

Android Build 系统是用来编译 Android 系统,Android SDK 以及相关文档的一套框架。众所周知,Android 是一个开源的操作系统。Android 的源码中包含了许许多多的模块。 不同产商的不同设备对于 Android 系统的定制都是不一样的。如何将这些模块统一管理起来,如何能够在不同的操作系统上进行编译,如何在编译时能够支持面向不同的硬件设备,不同的编译类型,且还要提供面向各个产商的定制扩展,是非常有难度的。 但 Android Build 系统很好的解决了这些问题,这里面有很多值得我们开发人员学习的地方。

Build的参数:

、内部类:

1、Build.VERSION 各种版本字符串

2、Build.VERSION_CODES 目前已知的版本代码的枚举类

静态属性

1、BOARD 主板:The name of the underlying board, like “goldfish”.

2、BOOTLOADER 系统启动程序版本号:The system bootloader version number.

3、BRAND 系统定制商:The consumer-visible brand with which the product/hardware will be associated, if any.

4、CPU_ABI cpu指令集:The name of the instruction set (CPU type + ABI convention) of native code.

5、CPU_ABI2 cpu指令集2:The name of the second instruction set (CPU type + ABI convention) of native code.

6、DEVICE 设备参数:The name of the industrial design.

7、DISPLAY 显示屏参数:A build ID string meant for displaying to the user

8、FINGERPRINT 唯一识别码:A string that uniquely identifies this build. Do not attempt to parse this value.

9、HARDWARE 硬件名称:The name of the hardware (from the kernel command line or /proc).

10、HOST

11、ID 修订版本列表:Either a changelist number, or a label like “M4-rc20”.

12、MANUFACTURER 硬件制造商:The manufacturer of the product/hardware.

13、MODEL 版本即最终用户可见的名称:The end-user-visible name for the end product.

14、PRODUCT 整个产品的名称:The name of the overall product.

15、RADIO 无线电固件版本:The radio firmware version number. 在API14后已过时。使用 getRadioVersion()代替。

16、SERIAL 硬件序列号:A hardware serial number, if available. Alphanumeric only, case-insensitive.

17、TAGS 描述build的标签,如未签名,debug等等。:Comma-separated tags describing the build, like “unsigned,debug”.

18、TIME

19、TYPE build的类型:The type of build, like “user” or “eng”.

20、USER

Build小Demo

package com.zsz.develop.builddemo;

import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
private TextView tvBuild01,tvBuild02,tvBuild03,tvBuild04,tvBuild05,tvBuild06,tvBuild07;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tvBuild01= (TextView) findViewById(R.id.tvBuild01);
    tvBuild02= (TextView) findViewById(R.id.tvBuild02);
    tvBuild03= (TextView) findViewById(R.id.tvBuild03);
    tvBuild04= (TextView) findViewById(R.id.tvBuild04);
    tvBuild05= (TextView) findViewById(R.id.tvBuild05);
    tvBuild06= (TextView) findViewById(R.id.tvBuild06);
    tvBuild07= (TextView) findViewById(R.id.tvBuild07);

    tvBuild01.setText("版本号: "+ Build.VERSION.SDK_INT);
    tvBuild02.setText("版本字符串号: "+ Build.VERSION.RELEASE);
    tvBuild03.setText("屏幕参数: "+ Build.DISPLAY);
    tvBuild04.setText("主板: "+  Build.BOARD);
    tvBuild05.setText("android系统定制商: "+ Build.BRAND);
    tvBuild06.setText("硬件名称: "+Build.FINGERPRINT);
    tvBuild07.setText("手机制造商: "+ Build.PRODUCT);




}

}

getWindow().setFlags()设置窗体

//设置窗体全屏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

//设置窗体始终点亮

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,

WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

//设置窗体背景模糊

getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

Android的kitkat是什么?

Android 4.4,是由Google公司制作和研发的代号为KitKat的手机操作系统

android4.4以后的透明状态栏一体化

//信号栏一体化
protected void initSystembarTint() {
    //kitkat代表android4.4.大于4.4才可以设置这些东西
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//设置透明状态栏
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//设置透明导航栏
        // 创建状态栏的管理实例
        SystemBarTintManager tintManager = new SystemBarTintManager(this);
        // 激活状态栏设置
        tintManager.setStatusBarTintEnabled(true);
        // 激活导航栏设置  
        tintManager.setStatusBarTintColor(Color.parseColor("#3B87C5"));
    }
}

Android 动画(anim)

Android的animation由四种类型组成:alpha(透明度)、scale(缩放)、translate(位移)、rotate(旋转)






Animation的简单使用

实现左边进入效果

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

    <translate
        android:duration="300"
        android:fromXDelta="-100%p"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toXDelta="0%p" />

</set>

实现右边退出效果

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

    <translate

        android:toXDelta="-100%p"
        android:toYDelta="0%p"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:duration="100"

        />
</set>

2015/9/6

20/9/6问题集

Android应用性能优化之使用SparseArray替代HashMap

SparseArray是Android提供的一个工具类。

SparseArray指的是稀疏数组(Sparse array),所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。

android之ViewGroup

作过Android 应用开发的朋友都知道,Android的UI界面都是由View和ViewGroup及其派生类组合而成的。其中,View是所有UI组件的基类,而ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的。AndroidUI界面的一般结构可参见下面的示意图:

关于LayoutInflater类inflate(int resource, ViewGroup root, boolean attachToRoot)方法三个参数的含义

resource:需要加载布局文件的id,意思是需要将这个布局文件中加载到Activity中来操作。

root:需要附加到resource资源文件的根控件,什么意思呢,就是inflate()会返回一个View对象,如果第三个参数attachToRoot为true,就将这个root作为根对象返回,否则仅仅将这个root对象的LayoutParams属性附加到resource对象的根布局对象上,也就是布局文件resource的最外层的View上,比如是一个LinearLayout或者其它的Layout对象。

attachToRoot:是否将root附加到布局文件的根视图上

attachToRoot就例如fragment和viewpager的结合使用的时候。问是否需要添加到布局文件上。笨蛋肯定要啊

2015/9/3

2015/9/3日问题集

奇葩的selector。

  • 1.item结尾直接/> 不要加《/item》
  • 2.有状态的selector要在前面。没有的在后面

    <?xml version=”1.0” encoding=”utf-8” ?>




2015/9/1

2015/9/2问题集

AlertDialog

AlertDialog是Dialog的一个直接子类

一个AlertDialog可以有两个Button或者3个Button

可以对一个AlertDialog设置title、message。

不能直接通过AlertDialog的构造函数来生成一个AlertDialog

一般生成的时候都是通过它的的一个内部静态类AlertDialog.Builder来构造的。

AlertDialog的使用 利用系统自带的进行设置

跟其他提示框一样要先创建成dialog,然后才可以show或者dismiss

package com.zsz.develop.alertdialogdemo;

    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;

    public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    send();
}

public void send()
{
// ....... 构造一个 AlertDialog
    AlertDialog.Builder builder = new AlertDialog.Builder(this)
            // 对话框标题
            .setTitle("简单对话框")
                    // 对话框图标
            .setIcon(R.mipmap.ic_launcher);
    // 对话框内容
    // .setMessage("对话框内容.");
// 添加一个按钮,并监听按钮事件 (积极的;确实的)
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(MainActivity.this, ControlActivity.class);
            startActivity(intent);
        }
    });
// 添加一个按钮,并监听按钮事件 (消极的;否认的)
    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(MainActivity.this, ControlActivity.class);
            startActivity(intent);
        }
    });
// 添加一个按钮,并监听按钮事件 (中立的)
    builder.setNeutralButton("帮助", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(MainActivity.this, ControlActivity.class);
            startActivity(intent);
        }
    });
// 列表
    CharSequence chars[] = {"hello", "wrold"};
// 列表项目对话框
    builder.setItems(chars, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // 点击了第几列
            Log.i("info", String.valueOf(which));
            // ... 动作
            Intent intent = new Intent(MainActivity.this, ControlActivity.class);
            startActivity(intent);
        }
    });
// 单选按钮
    builder.setSingleChoiceItems(chars, 0, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // 点击了第几列
            Log.i("info", String.valueOf(which));
            // ... 动作
            Intent intent = new Intent(MainActivity.this, ControlActivity.class);
            startActivity(intent);
        }
    });
    boolean m_boolean[] = {false, false};
// 多选按钮
    builder.setMultiChoiceItems(chars, m_boolean, new DialogInterface.OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
            // 获取点击事件,并进行记录
            Log.i("info", String.valueOf(which) + " " + String.valueOf(isChecked));
        }
        });
// 获取一个 View
// View root = this.getLayoutInflater().inflate(R.layout.activity_control, null);
// 可以设置 View
// builder.setView(root);
// 创建及显示
    builder.create().show();
// .......
}
}

CharSequence与String之间的区别

CharSequence与String都能用于定义字符串,但CharSequence的值是可读可写序列,而String的值是只读序列。

有message就没有item

还可以设置单选框多选框

单选框

.setSingleChoiceItems(new String[] {"选项1","选项2","选项3","选项4"}, 0, 

多选框

.setMultiChoiceItems(new String[] {"选项1","选项2","选项3","选项4"}, null, null)

#

AlertDialog的使用 自定义设置

package com.zsz.develop.alertdialogdemo;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class ControlActivity extends AppCompatActivity {
View root;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_control);
    findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            send();
        }
    });
}
public void send()
{
    // 获取一个 View
    root = this.getLayoutInflater().inflate(R.layout.activity_control, null);
    // .......
    AlertDialog.Builder builder = new AlertDialog.Builder(this)
            // 对话框标题
            .setTitle("简单对话框")
                    // 对话框图标
            .setIcon(R.mipmap.ic_launcher);
    // 对话框内容
    // .setMessage("对话框内容.");
    // 添加一个按钮,并监听按钮事件 (积极的;确实的)
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // 获取结果
            EditText edit = (EditText) root.findViewById(R.id.editText);
            EditText edit2 = (EditText) root.findViewById(R.id.editText2);
            Log.i("info", edit.getText().toString());
            Log.i("info", edit2.getText().toString());
        }
    });
    // 添加一个按钮,并监听按钮事件 (消极的;否认的)
    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(ControlActivity.this, ControlActivity.class);
            startActivity(intent);
        }
    });
    // 可以设置 View
    builder.setView(root);
    // 创建及显示
    builder.create().show();
    // .......
}
}

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.nljb.nljb.ControlActivity">


<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_alignParentTop="true">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="btn"
            android:id="@+id/btn"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="用户名"
            android:id="@+id/textView" />
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textPersonName"
            android:text="Name"
            android:ems="10"
            android:id="@+id/editText" />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="密    码"
            android:id="@+id/textView2" />
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="numberPassword"
            android:ems="10"
            android:id="@+id/editText2" />
    </LinearLayout>
</LinearLayout>
</RelativeLayout>

drawerlayoutandroid 抽屉效果的导航菜单实现

Spinner的使用

package com.zsz.develop.spinnerdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private static final String[] m={"A型","B型","O型","AB型","其他"};
private TextView view ;
private Spinner spinner;
private ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    view = (TextView) findViewById(R.id.spinnerText);
    spinner = (Spinner) findViewById(R.id.Spinner01);
    //将可选内容与ArrayAdapter连接起来
    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,m);

    //设置下拉列表的风格
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    //将adapter 添加到spinner中
    spinner.setAdapter(adapter);

    //添加事件Spinner事件监听
    spinner.setOnItemSelectedListener((AdapterView.OnItemSelectedListener) new SpinnerSelectedListener());

    //设置默认值
    spinner.setVisibility(View.VISIBLE);

}

//使用数组形式操作
class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener {

    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
                               long arg3) {
        view.setText("你的血型是:"+m[arg2]);

//这是得到spinner里面的内容
//        String selectedValue = (String)spType.getSelectedItem();
    }

    public void onNothingSelected(AdapterView<?> arg0) {
    }
}
}

layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<TextView android:id="@+id/spinnerText"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"></TextView>
<Spinner android:id="@+id/Spinner01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"></Spinner>
</LinearLayout>

2015/8/31-2

PopupWindow

PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。

Android的对话框有两种:PopupWindow和AlertDialog。它们的不同点在于:

AlertDialog的位置固定,而PopupWindow的位置可以随意

AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的

PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下

showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移

showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移

showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移

PopupWindow的使用

PopupWindow的构造函数为

public PopupWindow(View contentView, int width, int height, boolean focusable)

contentView为要显示的view,width和height为宽和高,值为像素值,也可以是MATCHT_PARENT和WRAP_CONTENT。

focusable为是否可以获得焦点,这是一个很重要的参数,也可以通过

public void setFocusable(boolean focusable)

来设置,如果focusable为false,在一个Activity弹出一个PopupWindow,按返回键,由于PopupWindow没有焦点,会直接退出Activity。如果focusable为true,PopupWindow弹出后,所有的触屏和物理按键都有PopupWindows处理。

mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));

设置了上面的就可以点击外面返回了。

简单使用

mianLayout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<Button
    android:id="@+id/btn_test_popupwindow"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="@string/app_name" />

</RelativeLayout>

popudWindow 的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#000000" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="80dp"
    android:text="wusisan"
    android:textColor="#ffffffff"
    android:layout_centerInParent="true"
    android:gravity="center"/>

</RelativeLayout>

mainActivity

package com.zsz.develop.popupwindowdemo;

import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

private Button mButton;
private PopupWindow mPopupWindow;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    View popupView = getLayoutInflater().inflate(R.layout.popup_window, null);

    mPopupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT, true);
    mPopupWindow.setTouchable(true);
    mPopupWindow.setOutsideTouchable(true);
    mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));

    mButton = (Button) findViewById(R.id.btn_test_popupwindow);
    mButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            mPopupWindow.showAsDropDown(v);
        }
    });
}


}

PopupWIndow的使用

View popupView= LayoutInflater.from(this).inflate(R.layout.popup_window_layout,null);
  mPopupWindow=new PopupWindow(popupView,200, RelativeLayout.LayoutParams.WRAP_CONTENT);
  mPopupWindow.setOutsideTouchable(true);
  mPopupWindow.setFocusable(true);
  mPopupWindow.setTouchable(true);
  mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));

  lvPopupWindow= (ListView) popupView.findViewById(R.id.lvPopupWindow);
  for (int i=0;i<5;i++){
      titleItemData=new TitleItemData("快递箱"+i);
      titleItemDataList.add(titleItemData);
  }
  titleItemAdapter=new TitleItemAdapter(MyExpressActivity.this,titleItemDataList);
  lvPopupWindow.setAdapter(titleItemAdapter);

2015/8/31

2015/8/31问题集

for each循环

  • 1.首先要传入多个参数
  • 2.for(View i:view)这里这个View要与传入的类型是相同的。
  • 3.i是要传入的每个值

o

private void ViewGone(View... view){
    for (View i:view){
        i.setVisibility(View.GONE);
    }

使用theme将ActionBar隐藏

再目录:\main\res\values\strings.xml 中的theme中更改

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
</style>

</resources>

再AndroidManifest.xml的application中更改设置

<application

 android:theme="@style/AppTheme" >

EditText 不要背景下面的横线

<EditText

              android:background="@null"
              />

text文字加粗

android:textStyle=”bold”

调用string中的东西

tvTopBarTitle.setText(R.string.myinfo_title);

主布局LinearLayout之—-fitsSystemWindows

设置应用布局时是否考虑系统窗口布局;如果为true

<item name="android:fitsSystemWindows">true</item>

主布局LinearLayout 之——clipToPadding

clipToPadding:控件的绘制区域是否在padding里面, 值为true时padding那么绘制的区域就不包括padding区域;
定义一个孩子是否仅限于画里面的界限。

<item name="android:clipToPadding">true</item>

pager和fragment绑定使用的完整代码。

pager和fragment绑定使用的完整代码。

Fragment的代码,没什么特别就只是一个界面而已。
但是这里要实现的方法和activity有点不同是实现OnCreateView(activity是实现OnCreate)

package com.zsz.develop.wisdomcommunity.main;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.zsz.develop.wisdomcommunity.R;

/**
 * Created by shengzhong on 2015/8/28.
 */
public class FragmentDoor extends Fragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view=inflater.inflate(R.layout.door_view_pager,null);
    return view;

}
}

pager页面

  • 1.定义好两个list一个装view、一个装fragment
  • 2.对于pager这种需要后期添加的都需要对他设置adapter
  • 3.pager是针对fragment设置的adapter所以他就要使用fragment的适配器。中间要加个管理器。
package com.zsz.develop.wisdomcommunity.main;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.zsz.develop.wisdomcommunity.R;
import com.zsz.develop.wisdomcommunity.function.StairsMouthActivity;
import com.zsz.develop.wisdomcommunity.myOneLine.MyBillActivity;
import com.zsz.develop.wisdomcommunity.myOneLine.MyHomeActivity;
import com.zsz.develop.wisdomcommunity.myOneLine.MyInfoActivity;
import com.zsz.develop.wisdomcommunity.myOneLine.MyMonitoringActivity;
import com.zsz.develop.wisdomcommunity.myTwoLine.MyExpressActivity;
import com.zsz.develop.wisdomcommunity.myTwoLine.MyInterflowMainActivity;
import com.zsz.develop.wisdomcommunity.myTwoLine.MyNeighbourActivity;

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

public class MainViewPagerActivity extends AppCompatActivity implements View.OnClickListener {

private ViewPager pager = null;
private List<Fragment> fragmentlist=new ArrayList<>();
ArrayList<View> viewContainter = new ArrayList<View>();

private LinearLayout llCloud,llDoor,llMy;
private View myView;
public String TAG = "tag";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_view_pager);



    pager= (ViewPager) findViewById(R.id.viewPager);

    llCloud= (LinearLayout) findViewById(R.id.llCloud);
    llDoor= (LinearLayout) findViewById(R.id.llDoor);
    llMy= (LinearLayout) findViewById(R.id.llMy);

    llMy.setOnClickListener(this);
    llDoor.setOnClickListener(this);
    llCloud.setOnClickListener(this);

    fragmentlist.add(new FragmentCloud());
    fragmentlist.add(new FragmentDoor());
    fragmentlist.add(new FragmentMy());

    myView= LayoutInflater.from(this).inflate(R.layout.my_view_pager,null);
    View doorView= LayoutInflater.from(this).inflate(R.layout.door_view_pager,null);
    View cloudView= LayoutInflater.from(this).inflate(R.layout.cloud_view_pager,null);

    viewContainter.add(cloudView);
    viewContainter.add(doorView);
    viewContainter.add(myView);





    pager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {


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

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


    pager.setCurrentItem(1);
    pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrollStateChanged(int arg0) {
            Log.d(TAG, "--------changed:" + arg0);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            Log.d(TAG, "-------scrolled arg0:" + arg0);
            Log.d(TAG, "-------scrolled arg1:" + arg1);
            Log.d(TAG, "-------scrolled arg2:" + arg2);
        }

        //选择的位置
        @Override
        public void onPageSelected(int position) {
            Log.d(TAG, "------selected:" + position);
        }
    });



}




@Override
public void onClick(View view) {
    int id=view.getId();
    switch (id){
        case R.id.llCloud:
            pager.setCurrentItem(0);
            break;
        case R.id.llDoor:
            pager.setCurrentItem(1);
            break;
        case R.id.llMy:
            pager.setCurrentItem(2);
            break;

   }

}

}

对于viewpager的layout

<android.support.v4.view.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    >

</android.support.v4.view.ViewPager>

最简单的pager和fragment的结合使用

package com.zsz.develop.exercisedemo;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import java.util.ArrayList;

public class ViewPagerActivity extends AppCompatActivity {

private ViewPager viewPager;
private ArrayList<Fragment> fragmentArrayList=new ArrayList<>();
private ArrayList<View> viewArrayList=new ArrayList<>();



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_pager);
    viewPager= (ViewPager) findViewById(R.id.vp);
    fragmentArrayList.add(new MyFragment());
    fragmentArrayList.add(new MyFragment02());
    fragmentArrayList.add(new MyFragment());

// viewArrayList.add()
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int i) {
return fragmentArrayList.get(i);
}

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

}

}

Android Studio 国内镜像文件地址,Fragment使用

2015/8/28

Android Studio 国内镜像文件地址

Fragment的使用

其实Fragment是个小Activiyt,那么他和Activity的区别。

  • 继承的时候继承Fragment。(layout还是那个layout)
  • 重写的是onCreateView(Activiyt重写的是onCreate)

举例

创建onCreateView,添加要返回的东西。inflater

package com.zsz.develop.wisdomcommunity.main;


import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.zsz.develop.wisdomcommunity.R;

/**
 * Created by shengzhong on 2015/8/28.
 */
public class FragmentCloud extends Fragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view=inflater.inflate(R.layout.cloud_view_pager, null);
    return view;

}
}

Fragment 问题之一

Fragment是通过inflater来加载布局,布局控件都是view。
在此找控件的时候就要采用

ll= (LinearLayout)view.findViewById(R.id.ll);

Fragment 问题之二

在Fragment中要得到context,只需要采用getActivity()

例如:

Intent Intent=new Intent(getActivity(),StairsMouthActivity.class);

#

listview没有显示,让按钮距离底部100dp,界面设置

2015/8/27

listview没有显示

原因之一:

父布局没改垂直导致错误,

因为listview要不断向父类添加,没有看到

让按钮距离底部100dp

<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
android:layout_marginBottom="100dp"
>
<TextView
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:text="外呼"
    android:id="@+id/tv_my_view_pager_Call"
    android:textSize="25sp"
    android:gravity="center"
    android:textColor="#FFFFFF"
    android:background="@drawable/call_shape"
    android:layout_alignParentBottom="true"

    />





<TextView
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:text="梯口机"
    android:textSize="30sp"
    android:layout_toRightOf="@id/tv_my_view_pager_Call"
    android:id="@+id/tv_my_view_pager_Stairs"
    android:layout_alignParentBottom="true"
    android:gravity="center"
    android:textColor="#FFFFFF"
    android:background="@drawable/stairs_shape"
    />

</RelativeLayout>

界面设置方法之一

几个文本宽设置,要先设置父级的高(例如50dp),再让布局立面的文字按钮等垂直居中。

界面设置方法之二

每个文本之间的间隔线

<View
       android:layout_width="match_parent"
       android:layout_height="0.5dp"
       android:background="#cdcdcd"></View>

界面设置之三 —-按钮变色

给他在drawable文件中设置一个按钮按下的xml文件,并设置里面按钮按下的变化。

例如:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <!--<item android:state_selected="true" android:drawable="@drawable/btn_blue_press" />-->
<!--<item android:drawable="@drawable/appbar_sd_selected" android:state_checked="true"/>-->
<item android:state_pressed="true" android:drawable="@drawable/btn_blue_press"/>
<item android:drawable="@drawable/newbtn_blue" />
</selector>

再在按钮图标上设置背景直接改为这个文件

界面设置之四——-使用styles是管理

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="mine_cicyle_style">
    <item name="android:layout_width">90dp</item>
    <item name="android:layout_height">90dp</item>
    <item name="android:orientation">vertical</item>
</style>
</resources>

当调用的时候:

style="@style/mine_cicyle_style"

拉界面设置之五——editText自动适配

配置editText的时候,他两边都有控件。这时候设置的时候就要让宽度为0dp,权重为1.只有他设置

<EditText
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"

        />