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在其范围内