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);显示




本文标签: 控件