学习笔记

1、Button 可以设置属性:
android:gravity="right|bottom"
   可使Button中的内容显示在Button的右下角;


2、创建的XML文件可选标签有shape、selector等;


3、为<Button节点设置android:background="@drawable/btn_selector"可设置按钮的初始颜色和按下后的颜色;
 其中btn_selector是自定义的selector节点的xml文件;


4、在Layout中画一条线:
   <View
                    android:layout_width="180dp"
                    android:layout_height="0.2dp"
                    android:background="#8C6931" />


5、为了实现延迟指定短暂时间的操作,除了利用线程+sleep的方法,还可以这样:
//定义并开始一个动画
AlphaAnimation alpha = new AlphaAnimation(0.0f, 1.0f);
alpha.setDuration(3000);
findViewById(R.id.ll_title_cover).startAnimation(alpha);
//为动画设置监听器
alpha.setAnimationListener(new AnimationListener() {


@Override
public void onAnimationStart(Animation animation) {


}


@Override
public void onAnimationRepeat(Animation animation) {


}


@Override
public void onAnimationEnd(Animation animation) {
// 动画结束时进行的所要延时的操作
...
}

});


============================================2014-11-18================================================

1、将一个Activity设置成窗口的样式:

在AndroidManifest.xml 中定义Activity的地方一句话:

android:theme="@android:style/Theme.Dialog"

或android:theme="@android:style/Theme.Translucent"就变成半透明的


2、如何退出Activity?如何安全退出已调用多个Activity的Application?对于单一Activity的应用来说,退出很简单,直接finish()即可。
当然,也可以用killProcess()和System.exit()这样的方法。
但是,对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity而已。

现提供几个方法,供参考:

(1)、抛异常强制退出:
该方法通过抛异常,使程序ForceClose。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

(2)、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

(3)、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

(4)、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

===========================================2014-12-09================================================

1、如果应用程序的多个界面布局基本相同,可以使用自定义一个BaseActivity,然后其他Activity从这个类继承的方式。

http://www.apkbus.com/android-59235-1-1.html

===========================================2014-12-10================================================

1、可以设置EditText中background为“@null”,可将编辑框的的边框消去;

2、可以创建一个类继承Application类,用于存放全局的数据;

http://blog.csdn.net/pi9nc/article/details/11200969

===========================================2014-12-11================================================

1、可以通过
this.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
设置界面为无标题样式;

2、控件的初始化必须在setContentView(...)之后,requestFeature()必须在setContentView之前;

3、设置ListView 的DividerHeight 可以控制Item间的间隔;


4、在ListView的Adapter中getView方法:
...
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
int ItemHeight = 50;
View v = inflater.inflate(R.layout.item_lv, null);
TextView tv = (TextView) v.findViewById(R.id.tv_lv);
tv.setText(dataLv.get(arg0));

/**
* 指定Item的高
*/
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT, ItemHeight);
v.setLayoutParams(lp);


return v;
}
...

5、改变Spinner中选中栏文本的颜色:


...
SpAdapter = new ArrayAdapter<String>(this, R.layout.item_spinner, dataSp);
...

item_spinner.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:gravity="left"
    android:paddingLeft="8dip"
    android:singleLine="true"
    android:textColor="#EE0000" //将字体设为红色
    android:textSize="22dip"
    android:textStyle="bold" />

6、对静态常量应该创建一个类似“Constant”的类,用于统一管理静态常量;
如:
public class Constant {
public staitc final String URL = "http://www.baidu.com";
  public staitc final int NEED_REFRESH = 11100;
public final static String USER_ACCOUNT= "UserAccount"; // 账号
public final static String USER_PASSWORD = "UserPassward"; // 密码
}

7、应该封装一个类似“AppConfig”的类,用于定义进行SharedPreference各项操作的类;

8、关于JSON(JavaScript Object Notation):
*JSON 对象在花括号“{ }”中书写:对象可以包含多个名称/值对:
eg.{"firstName":"Lee", "lastName":"David"}
*JSON 值可以是:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在方括号中)
对象(在花括号中)
null
*JSON数组 在方括号“[ ]”中书写,数组可包含多个对象
eg.{
"employees":[
{"firstName":"Lily","lastName":"Jones"},
{"firsrName":"Paker","lastName":"Joe"}
]
}
9、Focus相关:
View 对象可通过requestFocus()方法获取焦点;
View对象通过hasFoucs()方法判断是否持有焦点;
可通过实现OnFocusChangeListener接口,重写onFocusChange(View v,boolean hasFocus )方法,进行当焦点改变时进行的操作;

========================================2014-12-12========================================
1、Eclipse 操作技巧:
在一些闭口符号,如“( )”、“ { }”的开始(或结束)符号后一个位置(或前一个位置)双击,可选中该区域内的所有内容;


2、可通过Toast对象的setGravity()方法,设置吐司显示的位置:
如:
Toast mToast = Toast.makeText(getApplicationContext(),"Click!", 0);
mToast.setGravity(Gravity.CENTER, 0, 0);
mToast.show();


========================================2014-12-15========================================
1、Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。


2、MVC:M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。


3、GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
  POST把提交的数据则放置在是HTTP包的包体中。


4、在获取布局文件时,有时出现找不到的情况,可能是由于导入的R文件是android而不是本项目的R文件。解决办法是:查看import,将“android。R”删除,导入本项目的R文件;


5、 创建AlertDialog或ProgressDialog时,传入的Context应该是指定的Activity引用;
如:mPd = ProgressDialog.show(MainActivity.this, "Test", "Loading...");




========================================2014-12-16========================================


1、可重写Activity的 onKeyDown方法,监听按键
如:监听返回键  
...
@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
            dialog(); 
            return false; 
        } 
        return false; 
    }
...
========================================2014-12-22========================================


1、DatePickerDialog的使用:


/*
 *弹出对话框,选择日期并在界面中显示
/




public class MainActivity extends Activity {
private EditText mEditText;
private DatePickerDialog mDatePickerDialog;
private int month = 12;
private int day = 22;
private int year = 1988;


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


init();
}


private void init() {
mEditText = (EditText) findViewById(R.id.et_pickDate);


setDate();


mEditText.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View arg0) {
// 弹出日期选择对话框
mDatePickerDialog = new DatePickerDialog(MainActivity.this,
new OnDateSetListener() {


@Override
public void onDateSet(DatePicker 


arg0, int arg1,int arg2, int arg3) {
//重置当前年月日;
year = arg1;
month = arg2;
day = arg3;
setDate();
}
}, year, month, day);
mDatePickerDialog.show();
}
});
}
//设置时间
private void setDate() {
mEditText.setText(year + "-" + month + "-" + day);
}
}


2、获取当前时间
  
  方法一:

Calendar CD = Calendar.getInstance();
int YY = CD.get(Calendar.YEAR) ;
int MM = CD.get(Calendar.MONTH)+1;
int DD = CD.get(Calendar.DATE);
int HH = CD.get(Calendar.HOUR);
int NN = CD.get(Calendar.MINUTE);
int SS = CD.get(Calendar.SECOND);
int MI = CD.get(Calendar.MILLISECOND);


  方法二:
      
SimpleDateFormat    formatter    =   new    SimpleDateFormat    ("yyyy年MM月dd日    


HH:mm:ss     ");       
Date    curDate    =   new    Date(System.currentTimeMillis());//获取当前时间       
String    str    =    formatter.format(curDate);


========================================2014-12-23========================================
1、开发时需要考虑连续快速点击控件时的情形;


2、Eclipse:alt+上下键 可移动某行代码;

========================================2014-12-24========================================
1、类似LinearLayout,RadioGroup中可设置orientation属性为“horizontal”,使RadioGroup中的RadioButton水平分布;


2、要实现类似表格分隔线的效果可以利用View画线组合使用的方法实现;


如画横线:
   <View
            android:layout_width="fill_parent"
            android:layout_height="2dp"
            android:background="#696969" />
竖线:
 <View
                android:layout_width="2dp"
                android:layout_height="match_parent"
                android:background="#696969" />


3、 关于Selector:
Android中的Selector主要是用来改变ListView和Button控件的默认背景:
<?xml version="1.0" encoding="utf-8" ?>     
<selector xmlns:android="http://schemas.android.com/apk/res/android">   
<!-- 默认时的背景图片-->    
  <item android:drawable="@drawable/pic1" />      
<!-- 没有焦点时的背景图片 -->    
  <item android:state_window_focused="false"     android:drawable="@drawable/pic1" />     
<!-- 非触摸模式下获得焦点并单击时的背景图片 -->    
  <item android:state_focused="true" android:state_pressed="true"   android:drawable="@drawable/pic2" />   
<!-- 触摸模式下单击时的背景图片-->    
<item android:state_focused="false" android:state_pressed="true"android:drawable="@drawable/pic3" />    
<!--选中时的图片背景-->    
  <item android:state_selected="true"   android:drawable="@drawable/pic4" />     
<!--获得焦点时的图片背景-->    
  <item android:state_focused="true"   android:drawable="@drawable/pic5" />     
</selector>  


4、自定义CheckBox(selector+style):

首先在drawable中创建文件checkbox_selector.xml:


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" 
  android:drawable="@drawable/checkbox_ok" /><!--设置选中图片-->
<item android:state_checked="false" 
  android:drawable="@drawable/checkbox_empty" /><!--设置未选中图片-->
</selector>


然后在values中创建styles.xml:


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


<resources>


  <style name="MyCheckBox" parent="@android:style/Widget.CompoundButton.CheckBox">


  <item name="android:button">@drawable/checkbox_selector</item>


  <item name="android:paddingLeft">25.0dip</item>


  <item name="android:maxHeight">10.0dip</item>


  </style>


</resources>


最后在CheckBox中添加属性:


<CheckBox
        android:id="@+id/check"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_marginLeft="5dp"
        style="@style/MyCheckBox"  
        />


5、监听RadioButton:
...
//rgType 为RadioGroup
rgType.setOnCheckedChangeListener(new OnCheckedChangeListener() {


@Override
public void onCheckedChanged(RadioGroup rg, int arg1) {
//获取选中的CheckBox信息
int id = rg.getCheckedRadioButtonId();
RadioButton rb = (RadioButton) MainActivity.this
.findViewById(id);
makeToast(rb.getText() + "");
}
});
...
========================================2014-12-25========================================
1、使用VideoView播放视频:

MainActivity:


public class MainActivity extends Activity implements OnClickListener {
private VideoView mVideoView;
private Button play, pause;
// private static final String filePath = "/mnt/sdcard/tv.mp4";
private static final String filePath = Environment
.getExternalStorageDirectory() + "/tv.mp4";


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


initView();


}


private void initView() {
mVideoView = (VideoView) findViewById(R.id.vv);
play = (Button) findViewById(R.id.btn_play);
pause = (Button) findViewById(R.id.btn_pause);


play.setOnClickListener(this);
pause.setOnClickListener(this);
//为VideoView设置视频源
mVideoView.setVideoPath(filePath);
// mVideoView.setVideoURI(Uri.parse(fileName));
makeToast(filePath);
}


@Override
public void onClick(View view) {
int id = view.getId();


switch (id) {
case R.id.btn_play:
makeToast("开始播放视频");
if (!mVideoView.isPlaying()) {
mVideoView.start();
}
break;
case R.id.btn_pause:
// play();
mVideoView.pause();
break;
}
}
}


Layout:


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >


    <VideoView
        android:id="@+id/vv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_marginBottom="30dp"
        android:gravity="center"
        android:orientation="horizontal" >


        <Button
            android:id="@+id/btn_play"
            android:layout_width="50dp"
            android:layout_height="40dp"
            android:background="@drawable/movie_play_bt" />


        <Button
            android:id="@+id/btn_pause"
            android:layout_width="50dp"
            android:layout_height="40dp"
            android:layout_marginLeft="10dp"
            android:background="@drawable/movie_stop_bt" />
    </LinearLayout>


</FrameLayout>


2、ExpandableListView使用:


Layout:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >


    <ExpandableListView
        android:id="@+id/elv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ExpandableListView>


</LinearLayout>


Activity:


public class MainActivity extends Activity {
private List<String> listGroup;
private List<List<String>> listChild;
private ExpandableListView mExpandableListView;
private ExpandableAdapter mAdapter;


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


mExpandableListView = (ExpandableListView) findViewById(R.id.elv);
fillData();
mAdapter = new ExpandableAdapter(getApplicationContext(), listGroup,
listChild);


mExpandableListView.setAdapter(mAdapter);


// 设置Child点击事件监听
mExpandableListView.setOnChildClickListener(new OnChildClickListener() {


@Override
public boolean onChildClick(ExpandableListView arg0, View arg1,
int groupPosition, int childPosition, long arg4) {
makeToats(mAdapter.getChildData().get(groupPosition)
.get(childPosition));


return false;
}
});


}


private void fillData() {
listGroup = new ArrayList<String>();
listChild = new ArrayList<List<String>>();


listGroup.add("魏");
listGroup.add("蜀");
listGroup.add("吴");


List<String> items;
items = new ArrayList<String>();
items.add("张辽");
items.add("夏侯惇");
items.add("徐晃");


listChild.add(items);


items = new ArrayList<String>();
items.add("赵云");
items.add("马超");
items.add("姜维");


listChild.add(items);


items = new ArrayList<String>();
items.add("甘宁");
items.add("吕蒙");
items.add("太史慈");


listChild.add(items);
}


private void makeToats(String msg) {
Toast.makeText(getApplicationContext(), msg, 0).show();
}


}


Adapter:


package com.hztech.testexpandablelistview.adapter;


import java.util.List;


import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;


public class ExpandableAdapter extends BaseExpandableListAdapter {
private List<String> listGroup;
private List<List<String>> listChild;
private Context context;


public ExpandableAdapter(Context context, List<String> listGroup,
List<List<String>> listChild) {
this.context = context;
this.listGroup = listGroup;
this.listChild = listChild;
}


public List<String> getGroupData() {
return listGroup;
}


public List<List<String>> getChildData() {
return listChild;
}


@Override
public Object getChild(int groupPosition, int childPosition) {
return listChild.get(groupPosition).get(childPosition);
}


@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}


@Override
public View getChildView(int groupPosition, int childPosition,
boolean arg2, View arg3, ViewGroup arg4) {
String string = listChild.get(groupPosition).get(childPosition);
return getGenericView(string);
}


@Override
public int getChildrenCount(int arg0) {
return listChild.size();
}


@Override
public Object getGroup(int groupPosition) {
return listGroup.get(groupPosition);
}


@Override
public int getGroupCount() {
return listGroup.size();
}


@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}


@Override
public View getGroupView(int groupPosition, boolean arg1, View arg2,
ViewGroup arg3) {
String string = listGroup.get(groupPosition);
return getGenericView(string);
}


@Override
public boolean hasStableIds() {
return false;
}


@Override
public boolean isChildSelectable(int arg0, int arg1) {
// return false;
return true;
}


public TextView getGenericView(String string) {
// Layout parameters for the ExpandableListView
AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, 64);
TextView text = new TextView(context);
text.setLayoutParams(layoutParams);
// Center the text vertically
text.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
// Set the text starting position
text.setPadding(36, 0, 0, 0);
text.setText(string);
return text;
}
}

========================================2014-12-26========================================
1、设置Activity为横屏:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


2、Fragment的学习:
http://blog.csdn.net/lmj623565791/article/details/37970961


3、ViewPager


4、ListView Item中按钮的点击事件响应;
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
ListViewHolder holder = null;


// 初始化Holder
if (convertView == null) {
holder = new ListViewHolder();
convertView = mInflater.inflate(R.layout.item_listview, null);


holder.tvNum = (TextView) convertView.findViewById(R.id.tv_num);
holder.tvColor = (TextView) convertView.findViewById(R.id.tv_color);
holder.tvLocation = (TextView) convertView
.findViewById(R.id.tv_location);
// holder.cb = (CheckBox) convertView.findViewById(R.id.cb_item);
holder.btn = (Button) convertView.findViewById(R.id.btn_item);


convertView.setTag(holder);
} else {
holder = (ListViewHolder) convertView.getTag();
}
// 设置显示数据
holder.tvNum.setText(mData.get(position).getCarNum());
holder.tvColor.setText(mData.get(position).getCarColor());
holder.tvLocation.setText(mData.get(position).getLocation());
// 设置CheckBox的勾选状态
// holder.cb.setChecked(getItemStates().get(position)); //


final int tp = position;
holder.btn.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View arg0) {
Toast.makeText(mContext, mData.get(tp).toString(), 0).show();
}
});
return convertView;
}


注意:若在保证Item中按钮点击事件能够正常运作的情况下,也保持Item的点击事件能够生效,必须在布局文件中,将Button的focusable设为false,否则Item将无法获取焦点,也无法响应点击;


                                                                                


========================================2014-12-29========================================
1、ListView Item按钮事件监听:


...


public class MyListAdapter extends BaseAdapter {
private List<ItemInfo> data;
/* 存放按钮文本状态集合 */
private Map<Integer, String> statesBlue;
private Map<Integer, String> statesRed;
/* 存放按钮颜色状态集合 */
private Map<Integer, Integer> colorBlue;
private Map<Integer, Integer> colorRed;


private Context mContext;
private LayoutInflater mInflater;


public MyListAdapter() {
}


public MyListAdapter(Context context, List<ItemInfo> data) {
mContext = context;
mInflater = LayoutInflater.from(context);
this.data = data;


initStates();
}


/**
* 初始化状态
*/
private void initStates() {
statesBlue = new HashMap<Integer, String>();
statesRed = new HashMap<Integer, String>();
colorBlue = new HashMap<Integer, Integer>();
colorRed = new HashMap<Integer, Integer>();


for (int i = 0; i < data.size(); i++) {
statesBlue.put(i, "蓝色");
statesRed.put(i, "红色");
colorBlue.put(i, Color.BLUE);
colorRed.put(i, Color.RED);
}
}


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


@Override
public Object getItem(int position) {
return data.get(position);
}


@Override
public long getItemId(int position) {
return position;
}


@Override
public View getView(int position, View view, ViewGroup viewGroup) {
ViewHolder holder;


/* 优化 */
if (view == null) {
holder = new ViewHolder();


view = mInflater.inflate(R.layout.item_listview, null);


holder.tvId = (TextView) view.findViewById(R.id.tv_id);
holder.btnBlue = (Button) view.findViewById(R.id.btn_blue);
holder.btnRed = (Button) view.findViewById(R.id.btn_red);


view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
/* 根据保存的文本、颜色状态集合以及当前position,设置对应按钮的文本、及颜色 


*/
holder.tvId.setText(data.get(position).getId() + "");
holder.btnBlue.setText(statesBlue.get(position));
holder.btnBlue.setTextColor(colorBlue.get(position));
holder.btnRed.setText(statesRed.get(position));
holder.btnRed.setTextColor(colorRed.get(position));
/* 为两个按钮设置点击事件监听,注意,要传入当前Item的position */
holder.btnBlue.setOnClickListener(new MyButtonListener(position));
holder.btnRed.setOnClickListener(new MyButtonListener(position));


return view;
}


/**
* Item中按钮的点击事件监听

* @author Administrator

*/
private class MyButtonListener implements OnClickListener {
private int position;


public MyButtonListener(int position) {
this.position = position;
}


@Override
public void onClick(View arg0) {
int id = arg0.getId();
Button btn = ((Button) arg0);


if (id == R.id.btn_blue) {
// 点击“蓝色”按钮
String strBlue = "";
int color;
/* 判断当前按钮的文本及颜色,并做出对应改变 */
if (btn.getText().toString().equals("红色")) {
btn.setText("蓝色");
btn.setTextColor(Color.BLUE);
strBlue = "蓝色";
color = Color.BLUE;
} else {
btn.setText("红色");
btn.setTextColor(Color.RED);
strBlue = "红色";
color = Color.RED;
}
/* 将改变后的状态记录至对应Position的状态集合中 */
statesBlue.put(position, strBlue);
colorBlue.put(position, color);
return;
} else {
// 点击“红色”按钮
String strRed = "";
int color;
if (btn.getText().toString().equals("红色")) {
btn.setText("蓝色");
btn.setTextColor(Color.BLUE);
strRed = "蓝色";
color = Color.BLUE;
} else {
btn.setText("红色");
btn.setTextColor(Color.RED);
strRed = "红色";
color = Color.RED;
}
statesRed.put(position, strRed);
colorRed.put(position, color);


return;
}
}
}


public class ViewHolder {
private TextView tvId;
private Button btnBlue;
private Button btnRed;
}


}


...


总结,Item的position和对应保存的状态是关键。


2、ListView Item中的Button若没有在布局文件中设置focusable(false),将导致Item无法响应点击





3、ListView上拉点击按钮加载新数据(动态添加数据):
...
public class ClickToLoadMore extends Activity {
private List<ItemInfo> mData;
private ListView mListView;
private View viewLoad;
private MyClickToLoadAdapter mAdapter;
private LinearLayout layoutLoad; // 加载时显示的布局(环形进度条)
private Button btnLoad; // 点击加载更多按钮
private int lastVisibleIndex;
// 设置一个最大的数据条数,超过即不再加载
private int MaxDateNum = 50; // 设置最大数据条数


private Handler mHandler = new Handler();


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


initView();
initData();


mAdapter = new MyClickToLoadAdapter(getApplicationContext(), mData);


mListView.addFooterView(viewLoad);//为ListView添加底部布局
mListView.setAdapter(mAdapter);


btnLoad = (Button) findViewById(R.id.btn_loadmore);


btnLoad.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View arg0) {
btnLoad.setVisibility(Button.GONE);
layoutLoad.setVisibility(View.VISIBLE);


/* 延时2秒,模拟加载数据耗时 */
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
loadMoreDate();// 加载更多数据
btnLoad.setVisibility(View.VISIBLE);
layoutLoad.setVisibility(View.GONE);
mAdapter.notifyDataSetChanged();// 通知


listView刷新数据
}
}, 2000);
}
});


/**
* 监听ListView下拉
*/
mListView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {


}


@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// 计算最后可见条目的索引
lastVisibleIndex = firstVisibleItem + visibleItemCount - 1;


// 所有的条目已经和最大条数相等,则移除底部的View
if (totalItemCount == MaxDateNum + 1) {
mListView.removeFooterView(viewLoad);
Toast.makeText(getApplicationContext(), "数据已全部


加载完毕", 0)
.show();
}
}
});
}// onCreate


/**
* 初始化控件
*/
private void initView() {
mListView = (ListView) findViewById(R.id.lv_2);
layoutLoad = (LinearLayout) findViewById(R.id.ll_load);
viewLoad = LayoutInflater.from(ClickToLoadMore.this).inflate(
R.layout.item_load, null);
}


/**
* 初始化适配器数据
*/
private void initData() {
mData = new ArrayList<ItemInfo>();
ItemInfo info;


/* 初始化适配器数据 */
for (int i = 0; i < 20; i++) {
info = new ItemInfo(i);
mData.add(info);
}
info = null;
}


/**
* 添加新数据
*/
private void loadMoreDate() {
/* 获取适配器当前数据 */
mData = mAdapter.getData();
ItemInfo info;
int count = mAdapter.getCount();


/* 在原有数据上添加10条记录 */
for (int i = count; i < count + 10; i++) {
info = new ItemInfo(i);
mData.add(info);
}
// 调用适配器内部自定义的方法,更新适配器数据
mAdapter.setData(mData);
}


}// Activity
...

                                                                                


========================================2014-12-30========================================
1、ListView上拉加载更多数据:
...
public class PullToLoad extends Activity {
private Button mButton;
private List<ItemInfo> mData;
private ListView mListView;
private MyPullToLoadAdapter mAdapter;
private View viewFooter;
private int count; // 当前适配器中数据的条数
private int lastItemIndex; // 最后一个Item的坐标


private Handler mHandler = new Handler() {


@Override
public void handleMessage(Message msg) {
int what = msg.what;


switch (what) {
case Constant.MSG_BUTTON_GONE:
mButton.setVisibility(Button.GONE);
break;
case Constant.MSG_GET_DATA_SUCCESS:
mAdapter.setData(mData);
mListView.setAdapter(mAdapter);
setListViewListener();
break;


case Constant.MSG_LOAD_SUCCESS:
mAdapter.notifyDataSetChanged();
mListView.removeFooterView(viewFooter);
makeToast("加载成功");
mAdapter.setData(mData);


break;
}
}


};


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


initView();
initListener();
}


private void initView() {
mButton = (Button) findViewById(R.id.btn_load_pull);
mListView = (ListView) findViewById(R.id.lv_pull);
viewFooter = findViewById(R.id.ll_footer);
mAdapter = new MyPullToLoadAdapter(PullToLoad.this);
}


private void initListener() {
mButton.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View arg0) {
/**
* 开启线程获取数据
*/
new Thread() {
public void run() {
// 隐藏按钮
mHandler.sendEmptyMessage


(Constant.MSG_BUTTON_GONE);
// 获取数据
mData = getData();
mHandler.sendEmptyMessage


(Constant.MSG_GET_DATA_SUCCESS);
// mButton.setVisibility(Button.GONE);
}
}.start();
}
});
}


/**
* 初始化适配器数据
*/
private List<ItemInfo> getData() {
List<ItemInfo> td = new ArrayList<ItemInfo>();
ItemInfo info;


for (int i = 0; i < 20; i++) {
info = new ItemInfo(i);
td.add(info);
}
count = td.size();
return td;
}


/**
* 为ListView设置监听器
*/
private void setListViewListener() {
mListView.setOnScrollListener(new OnScrollListener() {


@Override
public void onScrollStateChanged(AbsListView view, int scrollState) 


{
// if (mListView.getLastVisiblePosition() == 


mAdapter.getCount()
// - 1) {
// 判断当前界面最后一个Item是否是是适配器中数据的最后一条
if (lastItemIndex == count - 1
&& scrollState == SCROLL_STATE_IDLE) {
// 加载新数据
viewFooter = LayoutInflater.from


(PullToLoad.this).inflate(
R.layout.item_load_footer, null);
mListView.addFooterView(viewFooter);


new Thread() {
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 调用方法,添加新数据
LoadMoreData();
mHandler.sendEmptyMessage


(Constant.MSG_LOAD_SUCCESS);
}
}.start();


}
}


@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// 每次滑动,记录当前界面中最后一个item的位置
lastItemIndex = firstVisibleItem + visibleItemCount - 1;
}
});
}


/**
* 加载新数据
*/
private void LoadMoreData() {
count = mAdapter.getCount();
ItemInfo info;


/**
* 在原有数据上添加
*/
for (int i = count; i < 20 + count; i++) {
info = new ItemInfo(i);
mData.add(info);
mAdapter.setData(mData);
}
count = mAdapter.getCount();// 更新count
}


private void makeToast(String msg) {
Toast.makeText(getApplicationContext(), msg, 0).show();
}
}
...

======================================2015-1-4============================================
1、获取设备宽度:
getResources().getDisplayMetrics().widthPixels;


2、监听编辑框状态:
EditText et = new EditText(this);
et.addTextChangedListener(tw);// 为输入框绑定一个监听文字变化的监听器


// 当输入框状态改变时,会调用相应的方法
    TextWatcher tw = new TextWatcher() {
                       @Override
                       public void onTextChanged(CharSequence s, int start, int before, int count) {
                           // TODO Auto-generated method stub
                       }
                       @Override
                       public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                           // TODO Auto-generated method stub
                       }
                       // 在文字改变后调用
                       @Override
                       public void afterTextChanged(Editable s) {
                           if (s.length() == 0) {
                               hideBtn();// 隐藏按钮
                           } else {
                               showBtn();// 显示按钮
                           }
                       }
                   };


3、background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸;


4、TextWatcher监听编辑框文编变化:
...


TextWatcher mTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}


@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}


// 在EditText内的文本改变后调用
@Override
public void afterTextChanged(Editable s) {
if (s.length() == 0) {
hideBtn();// 隐藏按钮
} else {
showBtn();// 显示按钮
}
}
};


mEditText.addTextChangedListener(mTextWatcher);


5、带清除按钮的EditText:


View布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal" >


    <EditText
        android:id="@+id/et_myet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入文本"
        android:singleLine="true" />


    <ImageButton
        android:id="@+id/ib_myet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:background="@drawable/btn_close"
        android:visibility="gone" />




</RelativeLayout>


View:


public class MyEditText extends LinearLayout {
private EditText mEditText;
private ImageButton mImageButton;


private TextWatcher mTextWatcher;


public MyEditText(Context context) {
super(context);
}


public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.view_medittext, this,
true);


init();
}


private void init() {
mEditText = (EditText) this.findViewById(R.id.et_myet);
mImageButton = (ImageButton) this.findViewById(R.id.ib_myet);


mImageButton.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View arg0) {
// 点击清除按钮
hideBtn();
mEditText.setText("");
}
});


mTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}


@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}


// 在EditText内的文本改变后调用
@Override
public void afterTextChanged(Editable s) {
if (s.length() == 0) {
hideBtn();// 隐藏按钮
} else {
showBtn();// 显示按钮
}
}
};


mEditText.addTextChangedListener(mTextWatcher);


}


/**
* 隐藏按钮
*/
private void hideBtn() {
if (mImageButton.isShown()) {
mImageButton.setVisibility(View.GONE);
}
}


/**
* 显示按钮
*/
private void showBtn() {
if (!mImageButton.isShown()) {
mImageButton.setVisibility(View.VISIBLE);
}
}


}


 ========================================2015-1-6===========================================


1、利用Camera类,调用系统摄像头进行照片拍摄:


http://bbs.51cto.com/thread-1063856-1.html


2、通过Intent打开系统拍照界面: ...  


private void takePicture() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, curCount);
}


...



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
String fileName = "testpic.jpg";



// String sdStatus = Environment.getExternalStorageState();
// if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用
// return;
// }
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式


FileOutputStream fos = null;
File picFile = new File(Environment.getExternalStorageDirectory(),
"/" + fileName);


try {
fos = new FileOutputStream(picFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);// 把数据写入文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


}
...

                                                                                


========================================2015-1-7========================================


1、手势监听:


public class Activity_2 extends Activity implements OnTouchListener,
OnGestureListener {


@SuppressWarnings("deprecation")
private RelativeLayout rlBg;
private static int curCount = 0;


private static final int DISTANCE = 100;
private static final int[] colors = new int[] { Color.BLACK, Color.RED,
Color.BLUE, Color.YELLOW, Color.GRAY, Color.GREEN, Color.MAGENTA };


private GestureDetector detector = new GestureDetector(this);


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


rlBg = (RelativeLayout) findViewById(R.id.rl_bg);


rlBg.setOnTouchListener(this);//为布局设置触摸事件监听
rlBg.setBackgroundColor(colors[curCount]);
}


/**
* 将触摸事件交给手势监听处理
*/
@Override
public boolean onTouch(View view, MotionEvent event) {
detector.onTouchEvent(event);
return true;
}


/**
* 触摸屏被按下时调用
*/
@Override
public boolean onDown(MotionEvent arg0) {
return false;
}


/**
* 触摸屏被滑动(抛掷)时调用
*/
@Override
public boolean onFling(MotionEvent eS, MotionEvent eE, float vX, float Vy) {
int startX = (int) eS.getX();
int startY = (int) eS.getY();
int endX = (int) eE.getX();
int endY = (int) eE.getY();


if ((endX - startX) > DISTANCE) {
// 向右滑动
curCount--;
makeToast("-------右滑");
} else if ((endX - startX) < -DISTANCE) {
// 向左滑动
curCount++;
makeToast("-------左滑");
} else if ((endY - startY) > DISTANCE) {
// 下滑
curCount--;
makeToast("-------下滑");
} else if ((endY - startY) < -DISTANCE) {
// 上滑
curCount++;
makeToast("-------上滑");
}
if (curCount < 0) {
curCount = 0;
} else if (curCount > colors.length - 1) {
curCount = colors.length - 1;
}
rlBg.setBackgroundColor(colors[curCount]);


return false;
}


/**
* 触摸屏被长按时调用
*/
@Override
public void onLongPress(MotionEvent arg0) {
makeToast("长按");
}


@Override
public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
float arg3) {
return false;
}


@Override
public void onShowPress(MotionEvent arg0) {


}


@Override
public boolean onSingleTapUp(MotionEvent arg0) {
return false;
}


private void makeToast(String msg) {
Toast.makeText(getApplicationContext(), msg, 0).show();
}


}


2、利用SlidingDrawer实现抽屉效果:


页面布局:

<?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:background="#3f3f3f"
    android:orientation="vertical" >


    <SlidingDrawer
        android:id="@+id/slidingdrawer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:content="@+id/content"
        android:handle="@+id/handle"
        android:orientation="vertical" >




        <ImageView
            android:id="@+id/handle"
            android:layout_width="50dip"
            android:layout_height="60dip"
            android:background="@drawable/ic_pulltorefresh_arrow_up" />


        <LinearLayout
            android:id="@id/content"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#ffffff" >


            <TextView
                android:id="@+id/tv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center_vertical|center_horizontal"
                android:text="这是一个滑动式抽屉的示例"
                android:textColor="#3a2b1c"
                android:textSize="18px"
                android:textStyle="bold" />
        </LinearLayout>
    </SlidingDrawer>


</LinearLayout><?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:background="#3f3f3f"
    android:orientation="vertical" >


    <SlidingDrawer
        android:id="@+id/slidingdrawer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:content="@+id/content"
        android:handle="@+id/handle"
        android:orientation="vertical" >




        <ImageView
            android:id="@+id/handle"
            android:layout_width="50dip"
            android:layout_height="60dip"
            android:background="@drawable/ic_pulltorefresh_arrow_up" />


        <LinearLayout
            android:id="@id/content"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#ffffff" >


            <TextView
                android:id="@+id/tv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center_vertical|center_horizontal"
                android:text="这是一个滑动式抽屉的示例"
                android:textColor="#3a2b1c"
                android:textSize="18px"
                android:textStyle="bold" />
        </LinearLayout>
    </SlidingDrawer>


</LinearLayout>


Activity代码:


public class Activity_1 extends Activity {
private SlidingDrawer mDrawer;
private ImageView ivbg;
private TextView tv;


/*
* (non-Javadoc)

* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity_1);


ivbg = (ImageView) findViewById(R.id.handle);
mDrawer = (SlidingDrawer) findViewById(R.id.slidingdrawer);
tv = (TextView) findViewById(R.id.tv);


mDrawer.setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener() {
@SuppressLint("NewApi")
@Override
public void onDrawerOpened() {
ivbg.setBackground(getResources().getDrawable(
R.drawable.ic_pulltorefresh_arrow));
}


});


mDrawer.setOnDrawerCloseListener(new SlidingDrawer.OnDrawerCloseListener() 


{


@SuppressLint("NewApi")
@Override
public void onDrawerClosed() {
ivbg.setBackground(getResources().getDrawable(
R.drawable.ic_pulltorefresh_arrow_up));
}


});


mDrawer.setOnDrawerScrollListener(new SlidingDrawer.OnDrawerScrollListener


() {


@Override
public void onScrollEnded() {
tv.setText("结束拖动");
}


@Override
public void onScrollStarted() {
tv.setText("开始拖动");
}


});


}
}

  =====================================2015-1-8========================================


1、PopupWindow


2、LinearLayout可设置divider属性,用于分隔布局中的控件(高版本);


3、利用HorizontalScrollView实现侧拉菜单效果:


自定义View:


public class SlideMenu extends HorizontalScrollView {
/**
* 屏幕宽度
*/
private int mScreenWidth;
/**
* dp
*/
private int mMenuRightPadding = 50;
/**
* 菜单的宽度
*/
private int mMenuWidth;
private int mHalfMenuWidth;


private boolean once;


public SlideMenu(Context context, AttributeSet attrs) {
super(context, attrs);
mScreenWidth = ScreenUtil.getScreenWidth(context);
}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
/**
* 显示的设置一个宽度
*/
if (!once) {
LinearLayout wrapper = (LinearLayout) getChildAt(0);
ViewGroup menu = (ViewGroup) wrapper.getChildAt(0);
ViewGroup content = (ViewGroup) wrapper.getChildAt(1);
// dp to px
mMenuRightPadding = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, mMenuRightPadding, content
.getResources().getDisplayMetrics());


mMenuWidth = mScreenWidth - mMenuRightPadding;
mHalfMenuWidth = mMenuWidth / 2;
menu.getLayoutParams().width = mMenuWidth;
content.getLayoutParams().width = mScreenWidth;


}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);


}


@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (changed) {
// 将菜单隐藏
this.scrollTo(mMenuWidth, 0);
once = true;
}
}


@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
// Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏
case MotionEvent.ACTION_UP:
int scrollX = getScrollX();
if (scrollX > mHalfMenuWidth)
this.smoothScrollTo(mMenuWidth, 0);
else
this.smoothScrollTo(0, 0);
return true;
}
return super.onTouchEvent(ev);
}


}


4、监听返回键(再按一次退出程序):


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getAction() == KeyEvent.ACTION_DOWN) {


if ((System.currentTimeMillis() - curTime) > 2000) {
makeToast("再按一次退出程序");
curTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
}
return true;
}


========================================2015-01-12========================================


1、图片缩放


2、在Activity生命周期方法(onCreate、onStart等)中调用Activity对象的finish()方法,能够将该对象的Activity关闭,但在调用finish     从如果finish()


3、Notification:


public class MainActivity extends Activity implements OnClickListener {
private Button btn_1, btn_2;
private NotificationManager mNotificationManager;
private NotificationCompat.Builder mBuilder;
private Notification mNotification;


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


init();


}


private void init() {
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this);


btn_1 = (Button) findViewById(R.id.btn_1);
btn_2 = (Button) findViewById(R.id.btn_2);


btn_1.setOnClickListener(this);
btn_2.setOnClickListener(this);


}


@Override
public void onClick(View view) {
int id = view.getId();


switch (id) {
case R.id.btn_1:
btn_1.setEnabled(false);
mBuilder.setContentTitle("测试标题")
// 设置通知栏标题
.setContentText("测试内容")
.setContentIntent(
getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) // 设置通知栏点击意图
// .setNumber(number) //设置通知集合的数量
.setTicker("测试通知来啦") // 通知首次出现在通知栏,带上升动画效果的
.setWhen(System.currentTimeMillis())// 通知产生的时间,会在通知信息里显示,一般是系统获取到的时间
.setPriority(Notification.PRIORITY_DEFAULT) // 设置该通知优先级
// .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消
.setOngoing(false)// ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setDefaults(Notification.DEFAULT_VIBRATE)// 向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合
// Notification.DEFAULT_ALL Notification.DEFAULT_SOUND 添加声音
// // requires VIBRATE permission
.setSmallIcon(R.drawable.ic_launcher);// 设置通知小ICON


mNotification = mBuilder.build();
mNotification.flags = Notification.FLAG_AUTO_CANCEL;


mNotificationManager.notify(1, mNotification);
break;


case R.id.btn_2:
btn_2.setEnabled(false);
mBuilder = new NotificationCompat.Builder(MainActivity.this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("Picture Download")
.setContentText("Download in progress");
mBuilder.setAutoCancel(true);
// 通过一个子线程,动态增加进度条刻度
new Thread(new Runnable() {
@Override
public void run() {
int incr;
for (incr = 0; incr <= 100; incr += 5) {
mBuilder.setProgress(100, incr, false);
mNotificationManager.notify(0, mBuilder.build());
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mBuilder.setContentText("Download complete")
.setProgress(0, 0, false)
.setDefaults(Notification.DEFAULT_VIBRATE);
mNotificationManager.notify(0, mBuilder.build());
}
}).start();
break;
}
}


public PendingIntent getDefalutIntent(int flags) {
Intent intent = new Intent();
intent.setAction("android.intent.action.CALL_BUTTON");


PendingIntent pendingIntent = PendingIntent.getActivity(
MainActivity.this, 0, intent, 0);
// PendingIntent pendingIntent = PendingIntent.getActivity(this, 1,
// new Intent(), flags);
return pendingIntent;
}


private void makeToast(String msg) {
Toast.makeText(getApplicationContext(), msg, 0).show();
}


}

========================================2015-01-15========================================


1、TextView的android:drawableLeft属性可在文本左侧添加Drawable;


2、KeyEvent.KEYCODE_ENTER相当于按下键盘的ENTER键(回车);


========================================2015-01-19========================================


1、
/**
* 将Bitmap类型转换为Byte数组

* @param bm
*            要转换为byte[]的Bitmap
* @return Bitmap对应的byte[]
*/
public static byte[] Bitmap2Bytes(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
return baos.toByteArray();
}


2、工程项目出现R文件丢失,且通过Clean等方法仍然无法生成,极大可能是因为drawable中的文件(图片等)或布局中出现了大写命名;


3、利用系统API进行人脸检测:


...
int MAX_FACES = 5;


//FaceDetecor只能读取RGB 565格式的Bitmap
Bitmap bm= Bitmap sampleBmp=BitmapFactory.decodeResource(getResources(), R.drawable.sample1).copy(Bitmap.Config.RGB_565, true);
FaceDetector faceDet = new FaceDetector(bm.getWidth(), bm.getHeight(), MAX_FACES);
FaceDetector.Face[] faceList = new FaceDetector.Face[MAX_FACES];
faceDet.findFaces(tmpBmp, faceList);
//通过读取保存在Face中的人脸数据,我们可以得到一个以两眼间距为边长,中心在两眼中点的一个正方形。
for (int i=0; i < faceList.length; i++) {
        FaceDetector.Face face = faceList[i];
               
if (face != null) {
                    PointF pf = new PointF();
                    //Sets the position of the mid-point between the eyes.
                    face.getMidPoint(pf);
                    RectF r = new RectF();
                    r.left = pf.x - face.eyesDistance() / 2;
                    r.right = pf.x + face.eyesDistance() / 2;
                    r.top = pf.y - face.eyesDistance() / 2;
                    r.bottom = pf.y + face.eyesDistance() / 2;
                    faceRects[i] = r;
                    detectedFaces++;
                }
            }


...


4、利用FaceDetector 进行人脸检测注意点:


当人眼距离少于100个像素时会识别不出来。如果静态图片尺寸较少,而手机的densityDpi又比较高的话,当图片放在drawable-hdpi文件夹下时会发生检测不到人脸的情况,同样的测试图片放在drawable-mdpi就可以正常检测。原因是不同的文件夹下,Bitmap加载进来后的尺寸大小不一样;


========================================2015-01-20========================================


1、在LinearLayout中,可以用以下方法来制造指定间隔区域:


<View
        android:id="@id/gesturepwd_creat_gap1"
           android:layout_width="fill_parent"
        android:layout_height="50.0dip"
        android:layout_weight="1.0" />


2、利用Color类自定义颜色、透明度值:


int WHITE = Color.rgb(255, 255, 255);
int WHITE_HALE_ALPHA = Color.argb(127, 255, 255, 255);//半透明白色


3、实现抖动效果(Animation)的一种方法:


Animation animation = new TranslateAnimation(-10, 10, 0, 0);
animation.setDuration(30);//抖动速率可以通过调节重复次数、动画时长来控制
animation.setRepeatCount(8);
animation.setRepeatMode(Animation.REVERSE);


4、在Activit中可以调用Activity中的setTitle(CharSequence title)方法,设置Activity标题栏的标题;


5、onDraw:
在View上绘制Canvas对象 一般会在onDraw函数,但是onDraw是一个触发事件产生的调用 只能通过特定的方法触发事件后来调用onDraw。这样就需要调用invalidate或者postInvalidate方法
可以在绘制完Canvas对象时 调用这2个方法就可以自动调用onDraw;


========================================2015-01-21========================================


1、ASC码48就是'0',也就是说'0'的值是48,而后依次是'1'到'9',char型减去48就是它对应的int值;




========================================2015-01-27========================================


1、要使RatingBar不可响应滑动修改,可设置XML属性:
android:isIndicator="true"


2、遇到点击编辑框弹出键盘压缩界面的问题,可以在Manifest对应Activity节点添加属性:
          android:windowSoftInputMode="adjustPan|stateHidden" 


3、TextView中有个ellipsize属性,作用是当文字过长时,该控件该如何显示,解释如下:

android:ellipsize="start"——省略号显示在开头
android:ellipsize="end"——省略号显示在结尾
android:ellipsize="middle"——省略号显示在中间
android:ellipsize="marquee"——以跑马灯的方式显示(动画横向移动)




========================================2015-02-02========================================


1、代码修改内容:


mDrawerHandleImg.setBackgroundResource(R.drawable.pic_handle_coachreview);




========================================2015-02-04========================================


1、在代码中指定View的宽高:
...
AbsListView.LayoutParams param = new AbsListView.LayoutParams(
android.view.ViewGroup.LayoutParams.FILL_PARENT, 450);
view.setLayoutParams(param);
...

========================================2015-02-09========================================


1、在需要绘制统计图(柱状图、饼状图)时,可以使用第三方jar包AChartEngine ,
可生成强大视觉效果的图表;




========================================2015-02-11========================================


1、在使用TextView的android:ellipsize属性来部分显示文本内容时,如果字数过多无法起作用。可以
加上 android:maxLines属性;




========================================2015-02-12========================================


1、可以使用list.add(0,Object),方法实现倒叙插入;


2、void android.view.ViewGroup.removeAllViews()可动态移除布局内的所有View;

============================2015-3-3=================================

1、Android Studio 快捷键:

  自动补全代码: Ctrl + Alt + Space
  自动修正、导包 : Alt + Enter
  自动排版:  Ctrl + Alt + L
  剪切一行:  Ctrl + X
  代码向上/下移动: Ctrl + Shift + Up/Down
  单行注释:  Ctrl + "/"
  复制行:  Ctrl+D

============================2015-3-4=================================

1、animation.setFillAfter(true):
 动画终止时停留在最后一帧,不然会回到没有执行前的状态

2、Fragment对象的getActivity()方法可获取关联Activity对象;

3、获取FragmentManager :
 FragmentManager fm = getSupportFragmentManager();

4、获取Fragment事务处理对象:
 FragmentTransaction ft = fm.beginTransaction();

5、Activity中获取Fragment对象:
   fm.findFragmentById(int id) 或 fm.findFragmentByTag(String tag);

 


============================2015-3-5=================================


1、给Fragment传递数据,可以:
Fragment f = new DemoFragment();
f.setArguments(Bundle bundle);
f.getArguments();


2、只有当activity在resumed状态时,fragment的生命周期才能独立的运转,
其它时候是依赖于activity的生命周期变化的;


============================2015-3-6=================================


1、Fragment与所在Activity通信:


首先在Fragment中定义共有接口,声明一个接口类型的成员变量;
然后在所处的Activity中实现这个接口,重写接口方法;
在Fragment中获取已实现该接口Activity对象的引用作为成员变量赋值;
Fragment通过这个接口类型成员变量,间接调用Activity中的接口方法,
这时就可以把需要传送的数据通过参数的形式进行传递。


eg:


public class TestFragment extends Fragment {
    ...
    private OnOptionSelectedListener mListener;
    ...


    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = OnOptionSelectedListener activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + "must implements OnOptionSelectedListener .");
        }
    }


    
    ...
    //定义接口
    public interface OnOptionSelectedListener {
        public void onOptionSelected(int optionId);
    }


   ...
}


 public class MainActivity extends FragmentActivity implements OnOptionSelectedListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    ...
     @Override
    public void OnOptionSelectedListener(int optionId) {
       //...可以根据参数进行相应业务逻辑处理
    }
}


2、不提倡在一个Fragment中直接操作另一个Fragment;


3、DialogFragment:




============================2015-3-9=================================


1、Google自带下拉刷新组件:
android.support.v4.widget.SwipeRefreshLayout


2、为EditText设置和属性
android:digits="01234568789qwertyuioplkjhgfdsazxcvbnm_",
可使EditText只接收字母、数字、下划线输入;


============================2015-3-10=================================


1、解决ListView Item中,Item点击事件与ImageButton点击事件共存问题:


   将ImageButton设置成添加属性focusable(false)
   将根布局的添加属性android:descendantFocusability="blocksDescendants" 


    android:descendantFocusability API描述如下: 


  Defines the relationship between the ViewGroup and its descendants
whenlooking for a View to take focus. Must be one of the following 
constant values. 


  该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。 
   属性的值有三种:  


      beforeDescendants:viewgroup会优先其子类控件而获取到焦点 


      afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点 


      blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点 


============================2015-3-11=================================


1、调用系统直接拨号:
 Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+"110"));
 context.startActivity(intent);


2、在界面(Fragment)中调用并打开系统拨号界面后注意:
原Activity会被重新构建,退出拨号界面后,又将重新构建一次;


eg:在Activity中点击按钮,打开系统拨号界面,Activity生命周期:
  打开拨号界面:pause.stop.destroy.create.start....destroy.
  关闭拨号界面:create.start.resume




============================2015-3-12=================================


1、ListView的setSelection()方法,可将ListView定位到指定位置;


2、Log.e(String tag, String msg):以Error的级别打印信息:


3、获取指定格式时间String:


 String tt = 1426072508000;
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:MM:SS");
 Date td = new Date(Long.valueOf(tt));
 String time = sdf.format(td);


============================2015-3-19=================================


1、适配器中的getView方法尽量不要写方法调用,因为会调用多次,可能出错;


============================2015-3-20=================================


1、代码的顺序会决定初始化的顺序;


2、 <ProgressBar
      style="@android:style/Widget.ProgressBar.Horizontal"
...
指定为条形进度条;


3、mProgressDialog.setProgress(ProgressDialog.STYLE_HORIZONTAL);//水平


============================2015-3-23=================================


1、在定义selector文件时,<item/> 不同的定义顺序,会产生不同效果;


2、RelativeLayout内部子控件的layout_centerVertical等属性,可使控制子
控件的对齐位置;


3、SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


HH:24进制小时
hh:12进制小时


============================2015-3-26=================================


1、要谨慎使用static变量,如果使用了,注意清空;


!2、当多个Fragment切换时,可以使用fragment.isAdded()方法,判断Fragment是
否已添加到Activity中;


============================2015-3-28=================================


1、有时候出现:
java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.CheckBox


并且布局、代码并没有错误时,可以Clean一下工程;

==============================2015-4-13================================


1、常用快捷键:


Alt+回车 导入包,自动修正


Ctrl+N   查找类


Ctrl+Shift+N 查找文件


Ctrl+Alt+L  格式化代码


Alt+Insert 生成代码(如get,set方法,构造函数等)


Ctrl+Shift+Space 自动补全代码


Ctrl+/ 或 Ctrl+Shift+/  注释(// 或者 )


Ctrl+E 最近打开的文件


Alt+ Up/Down 在方法间快速移动定位


F2 或Shift+F2 高亮错误或警告快速定位


==============================2015-4-14================================


!1、EventBus:


http://blog.csdn.net/jdsjlzx/article/details/40856535


2、Fragment里面嵌套Fragment,要用getChildFragmentManager()
来获取FragmentManager;




==============================2015-4-16================================


1、Fragment对象的 


Public final boolean isVisible()


如果该Fragment对象对用户可见,那么就返回true。
这就意味着它:
(1)已经被添加到Activity中;
(2)它的View对象已经被绑定到窗口中;
(3)没有被隐藏。


===============================2015-4-17===============================
!1、在遇到Activity生命周期异常时,可以检查Manifest是否设置了
 android:configChanges属性


===============================2015-4-20===============================


1、PopupWindow的使用:


 View view = getLayoutInflater().from(MainActivity.this).inflate(
R.layout.layout_popup_window, null);
mPopupWindow = new PopupWindow(view);
mPopupWindow.setFocusable(true);
mPopupWindow.setOutsideTouchable(true);
mPopupWindow.setBackgroundDrawable(new ColorDrawable(0));


        mPopupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
mPopupWindow.setHeight(190);
//指定窗口入场、退出动画
mPopupWindow.setAnimationStyle(R.style.PopupAnimationBottom);
//指定窗口显示的位置,layout为父容器
mPopupWindow.showAtLocation(layout, Gravity.BOTTOM, 0, 0);


 其中R.style.PopupAnimationBottom:


<style name="PopupAnimationBottom">
        <item name="@android:windowEnterAnimation">@anim/south_in</item>
        <item name="@android:windowExitAnimation">@anim/south_out</item>
</style>


 @anim/south_in:


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


    <translate
        android:duration="500"
        android:fromXDelta="0.0"
        android:fromYDelta="100%p" //"p"表示相对父容器
        android:toXDelta="0.0"
        android:toYDelta="0.0" />


    </set>


===============================2015-4-21===============================


1、设置Fragment切换动画:


FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction();

//必须在replace等之前
ft.setCustomAnimations(R.anim.west_in, R.anim.east_out);
ft.replace(R.id.layout_container, targetFragment,
String.valueOf(flag));
ft.commit();


===============================2015-4-22===============================


1、设置Activity切换动画:


//入场、退出动画
overridePendingTransition(R.anim.move_in_left, R.anim.move_out_left); 






===============================2015-4-24===============================


1、为TextView设置selector:


drawable/selector_text:


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/grey"></item>
    <item android:state_pressed="false" android:color="@color/white"></item>
</selector>


...
   android:textColor="@drawable/selector_text"


2、自身旋转anim
 <rotate
        android:duration="1000"
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatMode="restart"
        android:interpolator="@android:interpolator/accelerate_cubic">
</rotate>




===============================2015-5-12===============================


1、android:clipChildren:是否限制子View在其范围内


















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值