admin 管理员组文章数量: 887021
控件
1. 自定义控件:
编写一个类继承自一个控件类:
public class MyTextView extends TextView
在xml布局文件中声明控件为这种自定义的空间,注意一定要加上包名
<zy.qiufo.MyTextView
android:id="@+id/tvJW"
……
/>
代码中:
MyTextView m_txViewJW= (MyTextView)this.findViewById(R.id.tvJW);
2. PreferenceActivity
PerferenceActivity是什么,看下面的截图:
点开"更多选项"
android通过配置文件自动生成PreferenceActivity界面
在res文件夹下创建xml/setting_preferences.xml文件,然后创建类继承PreferenceActivity就可以了
<?xml version="1.0"encoding="utf-8"?>
<PreferenceScreen
xmlns:android="">
<CheckBoxPreference
android:key="autoBack"
android:title="自动回复"
android:summaryOn="开启"
android:summaryOff="关闭"
android:defaultValue="true"
/>
<PreferenceCategory android:title="SMS 助手">
<CheckBoxPreference
android:key="smsSilence"
android:title="静音"
android:summaryOn="开启"
android:summaryOff="关闭"
android:defaultValue="false"
/>
<PreferenceScreen android:title="更多选项">
<CheckBoxPreference
android:key="cb21"
android:title="功能1"
android:summaryOn="开启"
android:summaryOff="关闭"
android:defaultValue="true"
/>
<CheckBoxPreference
android:key="cb22"
android:title="功能2"
android:summaryOn="使用"
android:summaryOff="停用"
android:defaultValue="true"
/>
<ListPreference
android:key="list1"
android:title="android forum"
android:summary="开发论坛"
android:dialogTitle="请选择论坛"
android:entries="@array/entries_list_preference"
android:entryValues="@array/entriesvalue_list_preference"
/>
<EditTextPreference
android:key="et1"
android:title="EditTextPreference Sample"
android:summary="点击输入"
android:dialogTitle="输入设置"
android:defaultValue="Hello EditTextPreference"
/>
</PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory android:title="其他选项">
<RingtonePreference
android:key="rt1"
android:title="RingtonePreference Sample"
android:summary="选择铃声"
/>
</PreferenceCategory>
</PreferenceScreen>
在activity类的onCreate方法中调用:
addPreferencesFromResource(R.xml.seting_preferences);
根元素为PreferenceScreen 代表显示一整个屏幕,内部嵌套PreferenceCategory标签,表示偏好类别,在PreferenceCategory标签内部可以随便存放复选框,输入框,列表等显示控件.可包含的控件内容在android.preference包下可查阅.xml文件
编写好后我们要怎样获取屏幕的内容呢?
复写activity中的onPreferenceTreeClick 方法,在对屏幕显示的内容进行操作时,会触发此方法,在方法内部通过调用
Java代码
importandroid.preference.PreferenceManager;
SharedPreferencesprefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring",true);
即可得到屏幕上输入的内容,与使用SharedPreference对象一样,通过key-value 的形式获取,其中key是xml控件标签中key属性对应的值.
3. ImageView的android:scaleType="fitXY"属性设置让图片填满整个layout
4. 可以看出Button是继承于TextView的,所以TextView的一些属性也适用于Button控件。ImageButton继承自imageview,就是用一个图标代表了一些文字,它没Android:text属性。它由Android:src指定图标的位置android:src="@drawable/back_48",其他属性都和Button差不多
5. 做应用时,可能会需要动态改变控件的背景图片,如果仅仅是简单的点击,选中之类的事件,如果靠程序中写监听的代码就显得太麻烦了,在这种情况下,你可以使用selector动态改变控件背景拉:)
1。在res/drawable目录下建一个mybutton.xml文件,根据需要,不同的状态下建立不同的item,并对应相应的图片
<selectorxmlns:android="">
<item android:state_window_focused="false"
android:drawable="@color/transparent" />
<!-- Even though these two point to the same resource,have two states so the drawable will invalidate itself when coming out ofpressed state. 注意这句话-->
<item android:state_focused="true"android:state_enabled="false"
android:state_pressed="true"
android:drawable="@drawable/selector_background_disabled"/>
<item android:state_focused="true"android:state_enabled="false"
android:drawable="@drawable/lselector_background_disabled" />
<item android:state_focused="true"android:state_pressed="true"
android:drawable="@drawable/selector_background_transition" />
<item android:state_focused="false"android:state_pressed="true"
android:drawable="@drawable/selector_background_transition" />
<item android:state_focused="true"
android:drawable="@drawable/selector_background_focus" />
</selector>
2。在构造layout是引用这个xml
<ImageButton
android:id="@+id/ImageButton01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/mybutton">
</ImageButton>
6. ImageView显示jpg文件:
ImageView imView = new ImageView(this);
int imageResource = getResources().getIdentifier("pic"+icnt,"drawable", getPackageName());
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),imageResource);
imView.setImageBitmap(bitmap);
7. View的构造函数:
C1 public voidCustomView(Context context) {}
C2 public voidCustomView(Context context, AttributeSet attrs) {}
C3 public void CustomView(Contextcontext, AttributeSet attrs, int defStyle) {}
l C1是最简单的一个,如果你只打算用code动态创建一个view而不使用布局文件xml来创建view的话,那么实现C1就可以了。
l C2多了一个AttributeSet类型的参数,在通过布局文件xml创建一个view时,这个参数会将xml里设定的属性传递给构造函数。如果你在xml中声明这个自定义view却没有在code里实现C2,那么运行时就会报错。但是由于编译能顺利通过,这个错误有时不太容易被发现。
l C3一般不直接使用
8. 使用styles.xml为view指定的样式和风格可以定义一次,应用于多个view,避免样式在多个view中的重复定义,类似于网页中的CSS。
l 那么在xml里指定style有几种方式呢?大概有两种,一种是在直接在布局文件该view标签里使用
style="@style/customstyle"
来指定,另一种是采用指定theme的方式,在AndroidManifest.xml的application标签里使用
android:theme="@style/customstyle"
这两种方式都需要在res/values/styles.xml里定义customstyle:
<?xmlversion="1.0" encoding="utf-8"?>
<resources>
<stylename="customstyle">
<itemname="android:textSize">18sp</item>
[... other style item...]
</style>
[... other style...]
</resources>
注:使用theme时标准的theme定义方式是把style放在themes.xml里而不是styles.xml,但实际上R.java在生成时无论是themes.xml和styles.xml里的style都是同质的,都存在于R.style下。
Theme用于设置整个应用程序的风格,style用于设置单个view的风格,style优先级高于Theme
l styles.xml定义好后,在view的布局文件中使用该style:
<MyEditText id="@+id/text1"
style="@style/ customstyle "
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello, World!" />
9. setFocusable(true);
如果是自己定义一个继承自View的类,重新实现onKeyDown方法后,只有当该View获得焦点时才会调用onKeyDown方法,Actvity中的onKeyDown方法是当所有控件均没有处理该按键事件时,才会调用.
10. 按钮长按事件处理:
setLongClickable(true); //启用长按事件
启用长按事件后,系统会根据按下时间来决定是否处于长按状态(长按需要按下一段时间,以便区分是短按还是长按,这种区分都是系统自动完成的),如果是,则调用监听
器(OnLongClickListener)的onLongClick
在onLongClick里可以post一个Runnable,在Runnable里启动递归发送,类似于:
private Runnable mRepeater = new Runnable(){ //在线程中判断重复
public void run() {
调用长按事件的回调处理函数,如不断发射子弹
if (isPressed()) {//如果按住不放,就延迟一定时间后再post一个Runnable
postDelayed(this, mInterval);
}
}
};
按钮弹起后,删除所有post出去还没有执行的Runnable
public booleanonTouchEvent(MotionEvent event) {
if (event.getAction() ==MotionEvent.ACTION_UP) { //处理屏幕事件,长按完成
removeCallbacks(mRepeater);
}
return super.onTouchEvent(event);
}
11. Surfaceview:
Surfaceview可以在子线程中更新UI,view必须在主线程中更新UI
被动更新界面的应用,用view就好,如棋类游戏,只有被触摸才需要改变界面
主动更新的界面,必须用surfaceview,如游戏中一个人一直在跑,如果用view,就会阻塞其他操作,造成其他空间无法响应
实现surfaceHolder.callback接口,可以在surfaceview创建、销毁、改变时回调
surfaceHolder用于锁定并获取canvas,解锁cavas,添加回调响应。
12. LayoutInflater:在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于 findViewById(),
不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化!而findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。
有3中方法创建LayoutInflater:
LayoutInflaterinflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LayoutInflaterinflater = LayoutInflater.from(context); (该方法实质就是第一种方法,可参考源代码)
LayoutInflaterinflater = getLayoutInflater();(在Activity中可以使用,实际上是View子类下window的一个函数)
然后使用下面的方法吧layout下的一个xml转化成view实例
Viewlayout = inflater.inflate(R.layout.main, null);
详细样例见“LayoutInflater的使用.mht”
inflate方法就是根据layout布局xml来构建一个view,在view外面使用的时候(比如activity),用于得到一个view,在自定义view里面使用,就是构建view本身,比如自定义个FrameLayout,在构造函数里使用LayoutInflater.from(context).inflate(R.layout.layout_slideshow, this, true);(不要返回值,就是构造自定义FrameLayout本身)
13. Listview
一个listview要关联一个adapter,可以是arrayadapter或simpleadapter,或自定义
l Arrayadapter每一个item只能放入一行文字listview中放入的控件在layout中用xml定义,控件中放入的文字在数组中放入,典型的构造函数如下:
ArrayAdapter(Contextcontext, int textViewResourceId, T[] objects)
在数组中添加或删除元素后调用notifydatasetchange即可同步更新界面上的list控件显示
l Simpleadapter中一个item可以放入多个不同的控件,显示的数据存放在一个list中,list中存放一个map,map中元素和layout中xml的item控件一一对应,list一个元素(一个map)对应listview中一行,构造函数:
SimpleAdapter(Contextcontext,List<? extends Map<String, ?>>data, int resource, String[]from, int[] to)
From对应map的key
To为xml中一个item对应的控件id
如果行里面有类似lmageview这样的空间,通常map里的value是对应资源的id
l 自定义adapter继承自BaseAdapter,getCount抽象方法必须正确返回正确的list行数,getView抽象方法在每创建list一行前调用,在这个方法里,使用LayoutInflater的inflate方法把list的item描述文件转换成view,调用该view的setTag方法把item里的数据放进去,最后返回这个view即可。
14. Webview:
WebView是个好东西,作用相当于一个迷你的浏览器,采用Webkit内核,因此完美支持html,javascript,css等。有时候,我们完全可以把UI甚至数据处理都交给WebView,配合PHP等服务端程序,这样Android开发就变成了网页开发,可以省很多精力。
下面是一个WebView的简单例子,如果用把所有功能都交给服务端脚本处理,这个程序已经很完整了,你只要写好网页,把URL填上,再编译,就是一个新软件。
程序功能介绍:打开网页同时显示一个ProgressDialog,网页载入完毕则隐藏,点击页面上链接时再次显示ProgressDialog,载入完隐藏,可用返回键返回上一页。
XML布局:
1 2 3 4 5 6 7 8 9 1 | <?xml version="1.0" encoding="UTF-8"?> <AbsoluteLayout android:orientation="vertical" android:id="@+id/tab1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android=""> <WebView android:id="@+id/wv" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_x="0.0dip" android:layout_y="0.0dip" android:layout_weight="1.0" /> </AbsoluteLayout> |
JAVA代码:
1 2 3 4 5 6 7 8 9 1 1 1 1 1
1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3
| package com.pocketdigi.webview;
import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.KeyEvent; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient;
public class main extends Activity { /** Called when the activity is first created. */ WebView wv; ProgressDialog pd; Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init();//执行初始化函数 loadurl(wv,""); handler=new Handler(){ public void handleMessage(Message msg) {//定义一个Handler,用于处理下载线程与UI间通讯 if (!Thread.currentThread().isInterrupted()) { switch (msg.what) { case 0: pd.show();//显示进度对话框 break; case 1: pd.hide();//隐藏进度对话框,不可使用dismiss()、cancel(),否则再次调用show()时,显示的对话框小圆圈不会动。 break; } } super.handleMessage(msg); } }; } public void init(){//初始化 wv=(WebView)findViewById(R.id.wv); wv.getSettings().setJavaScriptEnabled(true);//可用JS wv.setScrollBarStyle(0);//滚动条风格,为0就是不给滚动条留空间,滚动条覆盖在网页上 wv.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(final WebView view, final String url) { loadurl(view,url);//载入网页 return true; }//重写点击动作,用webview载入
}); wv.setWebChromeClient(new WebChromeClient(){ public void onProgressChanged(WebView view,int progress){//载入进度改变而触发 if(progress==100){ handler.sendEmptyMessage(1);//如果全部载入,隐藏进度对话框 } super.onProgressChanged(view, progress); } });
pd=new ProgressDialog(main.this); pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); pd.setMessage("数据载入中,请稍候!"); } public boolean onKeyDown(int keyCode, KeyEvent event) {//捕捉返回键 if ((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()) { wv.goBack(); return true; }else if(keyCode == KeyEvent.KEYCODE_BACK){ ConfirmExit();//按了返回键,但已经不能返回,则执行退出确认 return true; } return super.onKeyDown(keyCode, event); } public void ConfirmExit(){//退出确认 AlertDialog.Builder ad=new AlertDialog.Builder(main.this); ad.setTitle("退出"); ad.setMessage("是否退出软件?"); ad.setPositiveButton("是", new DialogInterface.OnClickListener() {//退出按钮 @Override public void onClick(DialogInterface dialog, int i) { // TODO Auto-generated method stub main.this.finish();//关闭activity
} }); ad.setNegativeButton("否",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int i) { //不退出不用执行任何操作 } }); ad.show();//显示对话框 } public void loadurl(final WebView view,final String url){ //new Thread(){新版sdk中,不允许在子线程中调用webview方法,必须在ui线程中 //public void run(){ handler.sendEmptyMessage(0); view.loadUrl(url);//载入网页 // } // }.start(); }
} |
在WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
15. ViewFlipper:用于添加多个view,然后在各个view中切换
16. setAdjustViewBounds(true):设置imageview的图片填满而且不超过view的边界
17.textview默认是自动换行的
18.textview设置文字颜色:android:textColor="#99cccc"
19.控件可见与隐藏
android:visibility="gone"
此属性意思是此视图是否显示,例如RelativeLayout中android:visibility="gone"
其有三个属性:visible显示;invisible显示黑背景条;gone不显示
在类中,可以设置其显示与否,setVisibility(View.GONE);不显示
setVisibility(View.VISIBLE);显示
本文标签: 控件
版权声明:本文标题:控件 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687041452h57757.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论