一般来讲,我们用LayoutInflater做一件事:inflate。inflate这个方法总共有四种形式,目的都是把xml表述的layout转化为View。This class is used to instantiate layout XML file into its corresponding View objects . It is never be used directly -- use getLayoutInflater() or getSystemService(String)getLayoutInflater() or getSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on
1. Context.public abstract Object getSystemService (String name) :Return the handle to a system-level service by name. The class of the returned object varies by the requested name. 具体参见文档。
2. 2种获得LayoutInflater的方法
(1)通过SystemService获得
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
(2)从给定的context中获取
LayoutInflater.from(context)
(3)二者区别:实质是一样的,请看源码
public static LayoutInflater from(Context context) {
LayoutInflater LayoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (LayoutInflater == null) {
throw new AssertionError("LayoutInflater not found.");
}
return LayoutInflater;
}
3. LayoutInflater.inflate()
将Layout文件转换为View,顾名思义,专门供Layout使用的Inflater。虽然Layout也是View的子类,但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过findViewById(),这一段描述有误,看如下代码 。看下面文档写的已经很清楚。
Xml代码
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout android:id="@+id/placeslist_linearlayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>
</ScrollView>
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.placeslist_linearlayout);
linearLayout.addView(place_type_text);
这是可运行的,这上面的xml中,LinearLayout不再是Layout的代表,而只是一个普通的View。
4. findViewById有2中形式
R.layout.xx 是引用res/layout/xx.xml的布局文件(inflate方法),R.id.xx是引用布局文件里面的组件,组件的id是xx...(findViewById方法)。看看R.java配置文件吧,R对文件分类管理,多写几个layout.xml后你会发现,所有的组件id都能用R.id.xx来查看,但是组件不在setContentView()里面的layout中就无法使用,Activity.findViewById()会出现空指针异常 。
打开终端 ,终端窗口打开之后 ,输入下列命令:
gconftool --recursive-unset /apps/panel
接下来输入下列命令:
rm -rf ~/.gconf/apps/panel
最后还需要执行:
pkill gnome-panel
Ubuntu 默认的上下两栏面板就会恢复默认值
应用程序菜单不管用
rm -rf .config/menus/
1 一个不错的handler例子
public static final int UPDATE_DATA = 0;//常量,代表更新数据
public static final int UPDATE_COMPLETED = 1;//常量,代表更新数据
TextView tv;//TextView对象的引用
Button btnStart;//Button对象的引用
//主线程的Handler对象
Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {//重写处理消息方法
switch(msg.what){//判断消息类别
case UPDATE_DATA://消息为更新的数据
tv.setText("正在更新来自线程的数据:"+msg.arg1+"%...");
break;
case UPDATE_COMPLETED://消息为更新完毕
tv.setText("已完成来自线程的更新数据!");
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);//设置当前屏幕为R.layout.main布局文件
tv = (TextView)findViewById(R.id.tv);//获得屏幕中TextView对象引用
btnStart = (Button)findViewById(R.id.btnStart);//获得屏幕中Button对象引用
btnStart.setOnClickListener(new View.OnClickListener() {//为Button添加点击事件监听器
public void onClick(View v) {
new Thread(){//启动一个新线程
public void run(){
for(int i=0;i<100;i++){
try{//睡眠一段时间
Thread.sleep(150);
}
catch(Exception e){
e.printStackTrace();
}
Message m = myHandler.obtainMessage();//创建
Message对象
m.what = UPDATE_DATA;//为what字段赋值
m.arg1=i+1;//为arg1字段赋值
myHandler.sendMessage(m);//发出Message对象
}
myHandler.sendEmptyMessage(UPDATE_COMPLETED);//发出更新
完毕消息
}
}.start();
}
});
}
2 如果你对于Android的Thread+Handler方式感觉繁琐,不妨试试Activity提供的另外一种简单的方法runOnUiThread
,runOnUiThread可以帮助你在线程中执行UI更新操作,我们只需要在线程中写上类似
android123.this. runOnUiThread(new Runnable() {
@Override
public void run() {
// refresh ui 的操作代码
}
});
这里需要注意的是runOnUiThread是Activity中的方法,在线程中我们需要告诉系统是哪个activity调用,所以前面
显示的指明了activity。
runOnUiThread() 方法 类似于JAVA ui的 保护线程
3 一种启动时显示启动首屏,然后过2秒跳转到其他intent的用法:
new Handler().postDelayed(new Runnable(){
public void run() {
Intent mainIntent = new Intent(CoverActivity.this,PlayerActivity.class);
CoverActivity.this.startActivity(mainIntent);
CoverActivity.this.finish();
}
}, 2000);
4 多语言设置
英文系 /res/drawable/icong.png
/res/values/strings.xml
日本语系
/res/drawable-ja/icong.png
/res/values-ja/strings.xml
繁体 zh-rTW:
5 在一个典型的应用中,比如修改用户名密码后,把修改的信息发送到服务端的SERVLET中,可以采用如下模式:
StringBuilder requestString = new StringBuilder();
requestString.append("loginid=").append(userData[1])
.append("&oldpwd=").append(oldPassword.getText().toString
().trim())
.append("&newpwd=").append(newPassword.getText().toString
().trim());
final String url = OrderHttpUtil.BASE_URL +
OrderUrlUtil.MODIFY_PASSWORD_INFOR + requestString;
proDlg = OrderStringUtil.createProgressDialog(InforModifyActivity.this,
"提交请求", "正在提交请求数据,请稍后...",
false, true);
proDlg.show();
new Thread(){
@Override
public void run() {
/**
* res 结果判断
* -1 修改错误
* 0 修改成功
* 1 原密码错误
*/
String res = OrderHttpUtil.getHttpPostResultForUrl
(url);
Message m = new Message();
if("-1".equals(res))
m.what = OrderStringUtil.PASSWORD_ERROR;
else if("0".equals(res))
m.what = OrderStringUtil.PASSWORD_MODIFY_OK;
else
m.what = OrderStringUtil.PASSWORD_OLD_REEOR;
handler.sendMessage(m);
}
}.start();
handle处理:
private Handler handler = new Handler(){
public void dispatchMessage(Message msg) {
AlertDialog.Builder builder = new AlertDialog.Builder
(InforModifyActivity.this);
proDlg.dismiss();
switch(msg.what){
case OrderStringUtil.BASE_MODIFY_OK
{
...............................
}
}
6 adb相关操作
adb devices 列出状态
adb get-state
adb get-serialno 获得模拟器序号
安装apk
adb -s emualator-5556 install xxxx.apk
但注意,移除的时候要
adb uninstall com.liao.xxxxx(移除的时候要输入包的名称)
7 adb测试压力测试
adb -d shell monkey -p your.package.name -v 100
-p 表示指向的包名,-v 表示要测试的次数