Android常用控件总结

                                            Android常用控件总结

第一章

 1.1  Android中src文件夹包含项目的所有包及其资源文件,res文件夹包含了项目中所有的资源。比如:程序图标(drawable),布局文件(layout),常量(value),音频文件(raw)

    R.java是在创建项目是自动生成的只读文件,不可更改此文件。R文件其作用:是定义项目中所有资源的索引文件。

 

 1.2  AndroidManfest.xml 如下:

  

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

   <manifest               //根节点,描述了packege包中所有的内容

    xmlns:android="http://schemas.android.com/apk/res/android" //包命名空间的声明,使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据

    package="Android.Summary"         //引用程序包名

    android:versionCode="1"

    android:versionName="1.0">

   <uses-sdk android:minSdkVersion="7" />       //使用SDK版本号

 

   <application             //包含package中application级别组件声明的根节点,可包含application的一些全局和默认的属性,如标签label,icon,主题,必要的全限。注意:一个manifest中只能包含一个或0个application

    android:icon="@drawable/icon"         //应用程序图标

    android:label="@string/app_name">       //应用程序名字

     <activity android:name=".SummaryActivity"    //Activity用来与用户交互的主要工具,是用户打开程序的初始界面.此处为引用程序默认启动的Activity

       android:label="@string/app_name">

    <intent-filter>/           //描述了Activity的启动时间和位置,另外为了支持查找Activity可以包含一个或多个<intent-filter>

                <action android:name="android.intent.action.MAIN" />  //acton 为组件支持的Intent action

                <category android:name="android.intent.category.LAUNCHER" />//categor 为组件支持的Intent category 这里指定了引用程序的默认启动的Activity

    </intent-filter>

   </activity>

    <activity android:name = "Activity02"></activity>   //在此对新增的Activity进行注册。如果在不同的包中注意声明是将包名带上

   </application>

   </manifest>

  

 1.3  String.xml如下:

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

   <resources>              //此处定义了两个字符串资源,即定义了app_name,hello常量

    <string name="hello">Hello World, SummaryActivity!</string>

    <string name="app_name">Summary</string>

   </resources>

   如何使用这个资源呢?如下:

   Resources r = this.getContext().getResources();     //通过Context的getResource()实例化一个Resources对象

   String app_name = ((String)r.getString(R.string.app_name));  //然后通过getString()方法取得指定的索引的字符串。项目中所有常量都可以在String.xml文件中定义

   String hello = ((String)r.getString(R.string.hello));

 

 1.4  main.xml如下:

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

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"//LinearLayout 线程版面配置

    android:orientation="vertical"        //版面配置的方式。此为自上到下为垂直配置,"horizontal"为水平配置

    android:layout_width="fill_parent"       //定义当前视图在屏幕上所占的宽度,"fill_parent"为填充整个屏幕宽度

    /*android:layout_weight="50"*/         //用于给一个布局中多个视图的重要度赋值

    android:layout_height="fill_parent"       //定义当前视图在屏幕上所占的高度,...........................高度

    >

    <TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"       //随着视图的栏位的不同而改变这个视图的高度或宽度

    android:text="@string/hello"        //在视图上显示的内容,此处引用了@String中的hello字符串

    />

   </LinearLayout>

 

 1.5  src下的java 如下:

   package Android.Summary;

 

   import android.app.Activity;

   import android.os.Bundle;

 

   public class SummaryActivity extends Activity {     //继承自Activity

    /** Called when the activity is first created. */

   @Override

    public void onCreate(Bundle savedInstanceState){   //重写onCreate()方法

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);      //设置要显示的布局

    }

   }

 

第二章

 2.1  Android应用程序由四个模块组成:Activity,Service,Intent,ContentProvider(注意:一个应用程序不一定包含全部的四个模块).

   在使用时必须在AandroidManfest中进行声明。

    Activity可以理解为用户看到屏幕,主要用于处理应用程序的整体性工作。如:

     a.监听系统事件,触屏事件,为用户显示指定的View,启动其他Activity等。

     b.所有应用的Activity都继承于android.app.Activity,该类是Android提供的基层类。

     c.一个Activity通常就是一个单独的屏幕。

     d.每一个活动都被实现为一个独立的类。

     e.大多数的应用程序都是由多个Activity组成。

   

     Intent Aandroid中主要用Intent类实现从一个Activity跳转到另一个Activity。在Intent的描述结构中,有两个重要的部分:动作和对应的数据。

     典型的动作有MAIN,VIEW,PICK,EDIT.而动作对应的数据则以URI的形式表示。例如:要查一个人的联系方式,需要创建一个动作类型View的Intent

     ,以及一个表示这个人的URI.

     Intent的使用:

     button1.setOnClickListener(new Button.OnClickListener(){

      public void onClick(View v){

        Intent intent = new Intent();   //创建一个Intent对象

        intent.setClass(Activity01.this,Activity02.class);//指明要启动的另一Activity02

        startActivity(intent);     //启动一个新的Activity

        Activity01.this.finish();    //关闭当前Activity01

      }

     });

     这里需要注意在Android中对新启动的Activity进行声明。声明方式:

     <activity android:name = "Activity02"></activity>  //注意:如果在不同的包中在声明是还要加上包名

    

     IntentReceiver                                

      如果希望Android应用能够对外部事件(如电话打入时,数据网络可用时,)做出响应,可用使用IntentReceiver.虽然IntentReceiver在如上事件发生

     时会使用NotificationManager通知用户,但它并不能生产UI。IntentReceiver可以在AndroidManifest.xml中注册,也可在代码中使用Context.registerReceiver

     进行注册。当IntentReceiver被触发时,系统会在需要的时候启动应用。各种应用还可以通过ContentReceiver()将他们自己的IntentReceiver广播出去。   ???????

 

    Content Provider

     作用:主要用于不同应用程序中的数据的传递。

       Content Provider 是一个特殊的存储数据的类型。

       Android自身提供现成的Content Provider:Contacts ,Browser,CallLog,Settings,MediaStore

       应用可用通过唯一的ContentResolver界面来使用具体的Conten Provider,然后可以用ContentResolver提供的方法来使用你需要的Content Provider

      其中,ContentResolver提供的方法有query(),insert(),update()等。

       URI----String形式的Content Provider的完整路径。

    

     下面这个这个例子通过ContentProvider获取电话本中的数据,然后显示到TextView中去。

     public class Activity01 extends Activity{

      public void onCreate(Bundle savedInstanceState){

       TextView textView = new TextView(this);//得到TextView对象

       String string = "";

       super.onCreate(savedInstanceState);

      

       ContentResolver resolver = getContentResolver();//得到ContentResolver对象

       Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);//取得电话本中开始一项的光标,通过query方法查询出符合标准的电话本记录

        //向下移动光标

        while(cursor.moveToNext()){

        //取得联系人名字

        int name_index = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);

        String name = cursor.getString(name_index);

        //取得电话号码

        int number_index = cursor.getColumnIndex(PhoneLookup.NUMBER);

        String number = cursor.getString(number_index);

       

        string +=(name+":"+number+"\n");

        }

        cursor.close();

        textView.setText(string);//设置TextView显示的内容

        setContentView(textView);//显示到屏幕上 其实TextView也是View的一种

       }

      }

     注意:在使用这些模块中用到了读取联系人的API,所以必须在AndroidManifest.xml中声明

      声明方式为:

       <uses_permission

        android:name="android.permission.READ_CONTACTS">

       </uses-permission>

 

    Service 后台服务,没有界面

     启动service方法:

      a.Context.startService()

      b.Context.bindService()//与上一种方法不同处 如果这个Service没有处于启动状态,则将其启动

    

     下面这个例子以Activity中的俩个控件来控制播放一首Mp3. (例中:需要在res文件夹中创建一个raw文件夹 然后放入一首MP3)

   

     public class Activity01 extends Activity{

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

 

      //从main.xml布局中获得Button对象

      Button button_start = (Button)findViewById(R.id.start);

      Button button_stop = (Button)findViewById(R.id.stop);

      //设置按钮(Button)监听

      button_start.setOnClickListener(start);

      button_stop.setOnClickListener(stop);

      }

       //开始按钮

      private OnClickListener start = new OnClickListener(){

       public void onClick(View v){  

       //开启Service

       startService(new Intent("com.yarin.Android.MUSIC"));

       }

      };

       //停止按钮

      private OnClickListener stop = new OnClickListener(){

       public void onClick(View v){

       //停止Service

       stopService(new Intent("com.yarin.Android.MUSIC"));      

       }

      };

      }

 

     public class MusicService extends Service{

      //MediaPlayer对象

      private MediaPlayer player;

 

      public IBinder onBind(Intent arg0){

       return null;

       }

      public void onStart(Intent intent, int startId){

       super.onStart(intent, startId);

       //这里可以理解为装载音乐文件

       player = MediaPlayer.create(this, R.raw.test);

       //开始播放

       player.start();

       }

 

      public void onDestroy(){

       super.onDestroy();

       //停止音乐-停止Service

       player.stop();

       }

      }

    

     AndroidManifest.xml文件中

     <service android:name=".MusicService">

      <intent-filter>

       <action android:name="com.yarin.Android.MUSIC" />

       <category android:name="android.intent.category.default" />

      </intent-filter>

     </service>

    

 2.2  Aandrod的生命周期 

     public class Activity02 extends Activity{

      private static final String TAG = "Activity02";

 

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main2);

       Log.v(TAG, "onCreate");

      }

      public void onStart(){

       super.onStart();

       Log.v(TAG, "onStart");

      }

      public void onResume(){

       super.onResume();

       Log.v(TAG, "onResume");

      }

      public void onPause(){

       super.onPause();

       Log.v(TAG, "onPause");

      }

      public void onStop(){

       super.onStop();

       Log.v(TAG, "onStop");

      }

      public void onDestroy(){

       super.onDestroy();

       Log.v(TAG, "onDestroy");

      }

      public void onRestart(){

       super.onRestart();

       Log.v(TAG, "onReStart");

      }

     }

    这些方法都是系统自动调用的。

 

第三章

 3.1  事件处理

   * 控件事件通过设置其控件的监听器来监听并处理事件

   * 按键按下事件:通过重写onKeyDown方法

   * 按键弹起事件:通过重写onKeyUp方法

   * 触笔点击事件:通过实现onTouchEvent方法

   * 示例中使用了Toast控件:

    * Toast.makeText(this, string, Toast.LENGTH_SHORT).show();

 

     public class Activity01 extends Activity{

 

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

      //获得Button对象

      Button button_ok = (Button) findViewById(R.id.ok);

     

      button_ok.setOnClickListener(new Button.OnClickListener() {-------------------------------------------------------//设置Button控件监听器

       public void onClick(View v){

      //这里处理事件

        DisplayToast("点击了OK按钮");

        }

       });

      }

 

      /* 按键按下所触发的事件*/

      public boolean onKeyDown(int keyCode, KeyEvent event){

       switch (keyCode){

        case KeyEvent.KEYCODE_DPAD_CENTER:

         DisplayToast("按下:中键");

         break;

        case KeyEvent.KEYCODE_DPAD_UP:

         DisplayToast("按下:上方向键");

         break;

        case KeyEvent.KEYCODE_DPAD_DOWN:

         DisplayToast("按下:下方向键");

         break;

        case KeyEvent.KEYCODE_DPAD_LEFT:

         DisplayToast("按下:左方向键");

         break;

        case KeyEvent.KEYCODE_DPAD_RIGHT:

         DisplayToast("按下:右方向键");

         break;

        }

       return super.onKeyDown(keyCode, event);

       }

      /* 按键弹起所触发的事件*/

      public boolean onKeyUp(int keyCode, KeyEvent event){

       switch (keyCode){

        case KeyEvent.KEYCODE_DPAD_CENTER:

         DisplayToast("弹起:中键");

         break;

        case KeyEvent.KEYCODE_DPAD_UP:

         DisplayToast("弹起:上方向键");

         break;

        case KeyEvent.KEYCODE_DPAD_DOWN:

         DisplayToast("弹起:下方向键");

         break;

        case KeyEvent.KEYCODE_DPAD_LEFT:

         DisplayToast("弹起:左方向键");

         break;

        case KeyEvent.KEYCODE_DPAD_RIGHT:

         DisplayToast("弹起:右方向键");

         break;

        } 

       return super.onKeyUp(keyCode, event);

       }

      //用于响应按键重复点击,官方API指出onKeyMultiple方法总是返回false,即它没有handle,因此必须重写才能实现-------------------此方法没用过具体情况怎么样不是很清楚?

      public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){

 

       return super.onKeyMultiple(keyCode, repeatCount, event);

       }

 

      /* 触笔事件*/

      public boolean onTouchEvent(MotionEvent event){

       int iAction = event.getAction();  //利用getAction得到所执行的动作

       if (iAction == MotionEvent.ACTION_CANCEL ||

         iAction == MotionEvent.ACTION_DOWN ||

          iAction == MotionEvent.ACTION_MOVE){

        return false;

        }

      //得到触笔点击的位置

       int x = (int) event.getX();

       int y = (int) event.getY();

                //将获得的坐标转成String类型的方法

        DisplayToast("触笔点击坐标:("+Integer.toString(x)+","+Integer.toString(y)+")");

               

       return super.onTouchEvent(event);

      }

 

      /* 显示Toast  */

      public void DisplayToast(String str){

       Toast.makeText(this, str, Toast.LENGTH_SHORT).show();

       }

      }

   我们分析了一些常用事件处理方式。每一个键都对应一个键值。当然也可根据需要来改变一些键的功能,需要我们自己构建KeyEvent对象------------------有待进一步学习

   构造KeyEvent对象的几种方法:

       KeyEvent(int action,int code);

    KeyEvent(long DownTime,long EventTime,int action,int code,int repeat);

    KeyEvent(long DownTime,long EventTime,int action,int code,int repeat,int metState);

    KeyEvent(long DownTime,long EventTime,int action,int code,int repeat,int metState,int device,int scancode);

    KeyEvent(long DownTime,long EventTime,int action,int code,int repeat,int metState,int device,int scancode,int flags);

    KeyEvent(KeyEvent origEvent,long EventTime,int newRepart);

     例:

     public class Activity01 extends Activity{

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

      }

      public boolean onKeyDown(int keyCode, KeyEvent event){

       //这里构建KeyEvent对象,其功能为返回键的功能

       //因此我们按任意键都会执行返回键功能

      KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);

 

       //这里传入的参数就是我们自己构建的KeyEvent对象key

      return super.onKeyDown(key.getKeyCode(), key);

      }

     }

 3.2  常用控件

   Button

    xml设计

      <Button

       android:id="@+id/button"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       ></Button>

     

    代码设计Button button = new Button(this);

       button.setText("我是Button");

       button.setWidth(123);  //设置宽度

       button.setHeight(123); //设置高度

       button.setTextColor(Color.BLUE); //设置文字颜色

       button.setTextSize(123);   //设置字体大小

       button.setBackgroundColor(Color.BLUE);  //设置控件背景色

   

    监听器    

      button.setOnClickListener(new Button.OnClickListener(){//设置按钮的事件监听

       public void onClick(View v){

       //处理按钮事件产生一个Toast.利用button.getText()得到按钮显示的内容

       Toast toast = Toast.makeText(Activity01.this, "你点击了“"+button.getText()+"”按钮!", Toast.LENGTH_LONG);

       //设置toast显示的位置

       toast.setGravity(Gravity.TOP, 0, 150);

       //显示该Toast

       toast.show();

       }

      });

   -----------------------------------------------------------------------------------------------------------------------------

   TextView 一个用来显示文本的控件

    xml设计<TextView

       android:id= "@+id/textView"       //设置id

       android:layout_width ="fill_parent"  //宽度充满全屏

       android:layout_height="wrap_content" //高度随控件变化

       android:layout_height="2dip"

       android:textColor=""

       android:background="#aaa00" //背景颜色

       android:text="你好"/>

       android:paddingLeft="50px"

       android:paddingTop="5px"

       android:paddingBottom="5px"

       android:textSize="30sp"

       android:singleLine="true"

       android:layout_below="@id/imageView_handler"//在什么下

       android:gravity ="left"  //用于设置View中内容相对于View组件的对齐方式,

       android:layout_gravity//用于设置View组件相对于Container的对齐方式。

       android:paddingLeft="30px" // 按钮上设置的内容离按钮左边边界30个像素

       android:layout_marginLeft="30px"  //整个按钮离左边设置的内容30个像素

       android:layout_weight="1"//控件权重 即占的比例 默认值为0

       android:gravity="center_horizontal"//水平居中

       android:padding="3dip"

      

      

   

    代码设计TextView textView = new TextView(this); //声明对象

       textView.setTextColor(Color.RED);  //设置字体颜色

       textView.setTextSize(20);    //设置字体大小

       textView.setBackgroundColor(Color.BLUE);//控件背景色

       textView.setText("你好")    //显示的文字

       textView.setHeight

       textView.setWidth

       textView.setVisibility(GONE/VISIBLE); //设置为不可见/可见

       textView.setGravity(Gravity.CENTER);//设置文字权重

      

 

    监听器TextView textView = new TextView(this);  //得到对象

      textview.setOnClickListener(new TextView.OnClickListener(){-------------------------------------------TextView监听器

       public void onClick(View v){

       }

      });

   -------------------------------------------------------------------------------------------------------------------------------

   ImageButton 带图标的按钮

    xml设计

      <ImageButton 

       android:id= "@+id/imageButton1"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:src="@drawable/qq"   //在xml设计所使用的图片

      />

     

    代码中设计

      imageButton.setImageDrawable(getResources().getDrawable(R.drawable.image2));//在代码中设计使用的图片(得到对象后)

     

    监听器

      imageButton.setOnClickListener(new Button.OnClickListener() {---------------------------------------------ImageButton监听器

  

       @Override

       public void onClick(View v) {

        //创建对话框

        Dialog dialog = new AlertDialog.Builder(ImageButton_Dialog.this)

         .setTitle("ImageButton2")

         .setMessage("跳转到系统图片")

         .setPositiveButton("确定", new DialogInterface.OnClickListener() {    

          @Override

          public void onClick(DialogInterface dialog, int which) {

          // TODO Auto-generated method stub

          imageButton2.setImageDrawable(getResources().getDrawable(android.R.drawable.sym_action_call));

          }

         }).create();

         dialog.show();

       }

      });

   -------------------------------------------------------------------------------------------------------------------------------

   EditText

    xml设计

      <EditText

       android:id="@+id/editText"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:textSize="18sp"

       android:layout_x="29px"

       android:layout_y="33px"

       android:hint="请输入账号" //设置当m_EditText中为空时提示的内容

       />

      

    代码设计EditText editText = new EditText(this);//得到EditText对象

       editText.setTextSize(20);  //设置字体大小

       editText.setHint("请输入账号");  //设置当m_EditText中为空时提示的内容

    监听器

      editText.setOnKeyListener(new EditText.OnKeyListener(){-----------------------------------------EditText监听器

       @Override

       public boolean onKey(View arg0, int arg1, KeyEvent arg2){

   

        // 得到文字,将其显示到TextView中

        m_TextView.setText("文本框中内容是:" + m_EditText.getText().toString());

        return false;

       }

      });

   -----------------------------------------------------------------------------------------------------------------

   CheckBox 多项选择 需要对没有按钮设置监听器

    xml设计

     <CheckBox

      android:id="@+id/checkBox"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="@string/CheckBox4"

     >

    监听器    

     checkBox1.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {//对每个选项设置事件监听-------------------CheckBox监听器

     @Override

      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){

       if(m_CheckBox1.isChecked()){

         DisplayToast("你选择了:"+m_CheckBox1.getText());

       }

      }

     });

   -------------------------------------------------------------------------------------------------------------------

   Spinner 下拉列表

    下面一个例子将可选内容通过ArrayAdapter和下拉列表连接起来。设置监听器 通过setVisibility方法设置当前显示项

    main.xml

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

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

      android:orientation="vertical"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent"

      >

      <TextView 

       android:id="@+id/TextView1"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:text="@string/hello"

      />

      <Spinner

       android:id="@+id/Spinner1"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_centerHorizontal="true"

      />

     </LinearLayout>

 

     public class Activity01 extends Activity{

      private static final String[] string = { "O型", "A型", "B型", "AB型", "其他" };

 

      private TextView    m_TextView;

      private Spinner     m_Spinner;

      private ArrayAdapter<String> adapter;

 

      @Override

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

 

       m_TextView = (TextView) findViewById(R.id.TextView1);

       m_Spinner = (Spinner) findViewById(R.id.Spinner1);

 

       //将可选内容与ArrayAdapter连接

       adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, string);

 

       //设置下拉列表的风格

       adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

 

       //将adapter添加到m_Spinner中

       m_Spinner.setAdapter(adapter);

 

       //添加Spinner事件监听

       m_Spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {--------------------------Spinner监听器

 

        @Override

         public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3){

         m_TextView.setText("你的血型是:" + string[arg2]);

         //设置显示当前选择的项

         arg0.setVisibility(View.VISIBLE);

         }

 

        @Override

        public void onNothingSelected(AdapterView<?> arg0){

         // TODO Auto-generated method stub

         }

        );

       }

      }

     }

   ------------------------------------------------------------------------------------------------------

   RadioGroup , RadioButton 单选选择控件

    一个单选选择由两部分组成,分别是前面的选择按钮和后面的内容。按钮通过RadioButton来实现,答案通过RadioGroup来实现

   如果确定是选择哪一项那就要设置监听器setOnCheckedChangeListener.

    下面有一例子:本例中使用到了String.xml文件来定义常量。

   string.xml

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

     <resources>

      <string name="hello">Android底层是基于什么操作系统?</string>

      <string name="app_name">Examples_04_07</string>

      <string name="RadioButton1">Windows</string>

      <string name="RadioButton2">Linux</string>

      <string name="RadioButton3">Moc os</string>

      <string name="RadioButton4">Java</string>

     </resources>

  

   main.xml

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:orientation="vertical"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     >

     <TextView 

      android:id="@+id/TextView01"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="@string/hello"

     />

     <RadioGroup

      android:id="@+id/RadioGroup01"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:orientation="vertical"

      android:layout_x="3px"

      android:layout_y="54px"

      >

      <RadioButton

       android:id="@+id/RadioButton1"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="@string/RadioButton1"

      />

      <RadioButton

       android:id="@+id/RadioButton2"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="@string/RadioButton2"

      />

      <RadioButton

       android:id="@+id/RadioButton3"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="@string/RadioButton3"

      />

      <RadioButton

       android:id="@+id/RadioButton4"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="@string/RadioButton4"

      />

     </RadioGroup>   

    </LinearLayout>

  

    public class Activity01 extends Activity{

     TextView  m_TextView;

     RadioGroup  m_RadioGroup;

     RadioButton  m_Radio1, m_Radio2, m_Radio3, m_Radio4;

 

     @Override

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);

 

      m_RadioGroup = (RadioGroup) findViewById(R.id.RadioGroup01);//获得RadioGroup对象

      m_Radio1 = (RadioButton) findViewById(R.id.RadioButton1);//获得4个RadioButton对象

      m_Radio2 = (RadioButton) findViewById(R.id.RadioButton2);

      m_Radio3 = (RadioButton) findViewById(R.id.RadioButton3);

      m_Radio4 = (RadioButton) findViewById(R.id.RadioButton4);

 

     /* 设置事件监听  */

     m_RadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {---------------------------RadioGroup监听器

      @Override

      public void onCheckedChanged(RadioGroup group, int checkedId){

   

       if (checkedId == m_Radio2.getId()){

        DisplayToast("正确答案:" + m_Radio2.getText() + ",恭喜你,回答正确!");

       }else{

        DisplayToast("请注意,回答错误!");

        }

       }

      });

     }

     public void DisplayToast(String str)//显示Toast{

      Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG);

       //设置toast显示的位置

       toast.setGravity(Gravity.TOP, 0, 220);

       //显示该Toast

       toast.show();

     }

    }

   -----------------------------------------------------------------------------------------------------------

   AutoCompletTextView 和MultiAutoCompleteTextView 作用:自动提示   下面例中用到了ArrayAdapter

   autoCompletTextView.xml

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:orientation="vertical"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     >

     <AutoCompleteTextView 

      android:id= "@+id/autoCompleteTextView"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

     />

     <MultiAutoCompleteTextView 

      android:id= "@+id/multiAutoCompleteTextView"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

     />

    </LinearLayout>

   

   //如何实现如果输入的字符不在其范围内的也能得到提示  是继承TextWatcher?

    public class Control_Auto extends Activity {

       //implements TextWatcher{}

     public TextView textView_auto;

    

     private static final String[] string ={"ni hao","ni hao ","ni hao ma","ni zheng de hao ma","nshis"};

 

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState); 

      setContentView(R.layout.autocompletetextview);

      

       //将可选内容与适配器ArrayAdapter连接

      ArrayAdapter<String> adapter= new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,string);

     

      MultiAutoCompleteTextView multiAutoCompletTextView = (MultiAutoCompleteTextView)findViewById(R.id.multiAutoCompleteTextView);

      AutoCompleteTextView autoCompleteTextView =(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView);

                 

      autoCompleteTextView.setAdapter(adapter); //将adapter添加到AutoCompletTextView中去

      multiAutoCompletTextView.setAdapter(adapter); //将adapter添加到MultAutoCompleteTextView中去

     

      multiAutoCompletTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());

     }

    }

                     

    /*   //autoCompleteTextView.addTextChangedListener(this);---此为设置监听?

    * 例子中没有涉及到的属性(可在布局文件中设置):

    AutoCompleteTextView是EditText的子类,所以你可以对它的对象进行诸如外观/字体/颜色等属性值的设置。

     completionThreshold:它的值决定了你在AutoCompleteTextView至少输入几个字符,它才会具有自动提示的功能。另,默认最多提示20条。

     dropDownAnchor:它的值是一个View的ID,指定后,AutoCompleteTextView会在这个View下弹出自动提示。

     dropDownSelector:应该是设置自动提示的背景色之类的。

     dropDownWidth:设置自动提示列表的宽度。

    你可以通过setAdapter()来给AutoCompleteTextView添加一个包含候选值列表的适配器(adapter)。--------此处没实现过?

    然而,由于用户可以输入一些不在候选值列表的数据,AutoCompleteTextView不支

    持selection listener。不过,你可以注册一个TextWacther用于当用户输入文本发生变化时发出通知。

   ----------------------------------------------------------------------------------------------------------------------

   DatePicker,TimePicker 日期和时间

    下例中首先需要在布局文件中定义DatePicker和TimePicker,然后通过Canlendar类获得系统时间,接着通过init方法将日期传给DatePicker,

    并设置OnDateChangedListener来监听日期改变,当时间被改变时需要设置setOnTimeChangedListener监听来设置时间。

   datepicker_timepicker.xml

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:orientation="vertical"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     >

     <TextView 

      android:id= "@+id/textView_date_time1"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:text="TextView"

     />

     <DatePicker 

      android:id= "@+id/datePicker"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

     />

     <TimePicker 

      android:id= "@+id/timerPicker"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

     />

     <Button 

      android:id= "@+id/button_date_time1"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:text="日期"

     />

     <Button 

      android:id= "@+id/button_date_time2"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:text="时间"

     />

    </LinearLayout>

 

    public class Date_Time extends Activity{//如何实现日期随系统不断变化?要联网才能实现?如何变换DatePicker和TimePicker样式(如颜色 ,图片等)?

      Calendar calendar;

      TextView textView_date_time;

      Button button_date_time1;

      Button button_date_time2;

      DatePicker datePicker;

      TimePicker timePicker;

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.datepicker_timepicker);

      calendar = Calendar.getInstance();//得到日历对象

 

       textView_date_time = (TextView)findViewById(R.id.textView_date_time1);

       button_date_time1 = (Button)findViewById(R.id.button_date_time1);

       button_date_time2 = (Button)findViewById(R.id.button_date_time2);

       datePicker = (DatePicker)findViewById(R.id.datePicker);

       timePicker = (TimePicker)findViewById(R.id.timerPicker);

 

       button_date_time1.setWidth(50);

       button_date_time1.setHeight(60);

       button_date_time1.setTextColor(Color.BLUE);

      

       timePicker.setIs24HourView(true);//设置为24小时制

  

       //将日历初始化为当前系统日期 , 并设置监听器

      datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), --------------------------------------------DatePicker监听器

           calendar.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() {//OnDateChangedListener监听日期的变化

    

       @Override

       public void onDateChanged(DatePicker view, int year, int monthOfYear,

                 int dayOfMonth) {

         //设置日期

         calendar.set(1987,10,15);

       }

      });

    

      timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {-------------------------------------------TimePicker监听器

  

       @Override

       public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {

   

        //设置时间

        //calendar.set(1987,10,29,23,23,23);//年 月   日  小时  分钟  秒

        textView_date_time.setText("当前时间:"+hourOfDay+" : "+minute);

       }

      });

      

      button_date_time1.setOnClickListener(new Button.OnClickListener(){//日期的监听---------------------------Button控件中设置DatePicker监听器

 

       @Override

       public void onClick(View v) {

        new DatePickerDialog(Date_Time.this,new DatePickerDialog.OnDateSetListener(){

    

       @Override

        public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) {

        //设置日历

         textView_date_time.setText("农历"+year+" 年"+monthOfYear+" 月"+dayOfMonth+" 日");

        }

        },calendar.get(Calendar.YEAR) , calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH)).show();   

       }    

      });

     

      button_date_time2.setOnClickListener(new Button.OnClickListener(){//时间的监听器----------------------------Button控件中设置TimePicker监听器

 

       @Override

       public void onClick(View v) {new TimePickerDialog(Date_Time.this, new TimePickerDialog.OnTimeSetListener() {

    

        @Override

         public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

     

         //设置时间

          textView_date_time.setText("北京时间:"+hourOfDay+" : "+minute);

         }

        },calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true).show();

       }});

     }

 

    }

 

 

   ------------------------------------------------------------------------------------------------------------

   Menu 操作应用程序的菜单选项

     第一个例子:通过XML文件来实现

    menu_com.xml

     <menu xmlns:android="http://schemas.android.com/apk/res/android">

      <item android:id="@+id/about"

        android:title="关于"/>

      <item android:id="@+id/skip"

        android:title="到menu_add中去" />

     </menu>

 

     public class Menu_Xml extends Activity{

       public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);

        setContentView(R.layout.此为所以显示的界面id); 

       }

       public boolean onCreateOptionsMenu(Menu menu){//创建menu

        MenuInflater inflater = getMenuInflater();

        //设置menu界面

        inflater.inflate(R.layout.menu_com, menu);

        return true;

       }

       public boolean onOptionsItemSelected(MenuItem item){//处理菜单事件

        switch(item.getItemId()){

         case R.id.about:

          Menu_Xml.this.finish();

         case R.id.skip:

          Intent intent = new Intent();

          intent.setClass(Menu_Xml.this, Menu_add.class);//跳转到Menu_add中去

          startActivity(intent);

          Menu_Xml.this.finish();

        }

        return true;

 

       }

      }

   ===========================================================================================================

     第二个例子:在代码中生成Menu  此例中包含俩个方法 注意区分注释掉的为另一种增加Menu的方法

     public class Menu_add extends Activity{

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       setContentView(R.layout.toast);

      }

      public boolean onCreateOptionsMenu(Menu menu){//创立menu

      /*为Menu添加内容参数:Menu.add()方法第一个参数表示给这个新增的菜单项分配一个分组号;

      * 第二个参数表示给这个新增的菜单项分配一个唯一标识id;第三个参数为菜单项的序号;

      * 第四个参数为菜单项的标题。

      我们可以通过调用Menu.setItemShown()或者Menu.setGroupShown()方法来显示或隐藏一些菜单项。

      这里要注意的一个地方是:菜单项的显示顺序是按代码中添加的顺序来的,也就是说Menu.add()方法

      只能在菜单的最后面新增一个菜单项。另外,第一个参数的分组标识,不会改变菜单项的显示顺序。

     

      方法一:

       //menu.add(0,0,0,R.string.menu1);方法一

       //menu.add(0,1,1,R.string.menu2);

      方法二:

       SubMenu subMenu = menu.addSubMenu(1, 1, 2, "选项");//此方法和menu方法类似

       subMenu.add(13,13,13, "到Content_Menu");

       subMenu.add(13,24,24,"到Menu_Xml");

 

       return true;

      }

      public boolean onOptionsItemSelected(MenuItem item){//处理Menu事件

       switch(item.getItemId()){//getItemId()得到菜单项的ID,即上面的第二个参数

        case 13:

         Intent intent1 = new Intent();

         intent1.setClass(Menu_add.this, Context_Menu.class);

         startActivity(intent1);

         Menu_add.this.finish();

        case 23:

         Intent intent = new Intent();

         intent.setClass(Menu_add.this, Menu_Xml.class);//跳转到其他界面中去

         startActivity(intent);

         Menu_add.this.finish();

         break;

       }

       return true; 

      }

     }

   ==========================================================================================================

     第三个例子:Context Menu的创建:

        概述:Android 的上下文菜单类似于PC 上的右键菜单。当为一个视图注册了上下文菜单之后,

        长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单。任何视图都可以

        注册上下文菜单,不过,最常见的是用于列表视图ListView的item。

 

        注意:Android 的上下文菜单不支持图标或快捷键。

        创建一个上下文菜单的步骤:

        1. 覆盖Activity 的onCreateContenxtMenu() 方法,调用Menu 的add 方法添加菜单项(MenuItem)。

        2. 覆盖Activity 的onContextItemSelected() 方法,响应上下文菜单菜单项的单击事件。

        3. 调用registerForContextMenu() 方法,为视图注册上下文菜单。

    menu_com2.xml

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

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

      android:orientation="vertical"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent"

      >

      <TextView 

       android:id= "@+id/textView_context_Menu"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:text="长按我 我才会出现TextView"

      />

      <Button

       android:id= "@+id/button_context_Menu"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:text="长按我 我才会出现Button"

      />

     </LinearLayout>

 

     public class Context_Menu extends Activity{

      public TextView textView_context_Menu;

      public Button buttont_context_Menu;

 

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       setContentView(R.layout.menu_com2);

       textView_context_Menu = (TextView)findViewById(R.id.textView_context_Menu);

       buttont_context_Menu = (Button)findViewById(R.id.button_context_Menu);

      

       registerForContextMenu(textView_context_Menu);

       registerForContextMenu(buttont_context_Menu);

       //这里的registerForContextMenu()也可以用下面的语句替代

       //getContentView().setOnCreateContextMenuListener(this);

      }

      //创建Context Menu

      public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo){

       if(v==textView_context_Menu){

        menu.setHeaderTitle("这个是什么?");

        menu.add(0,0,0,"苹果");

        menu.add(0,1,1,"猕猴桃");

       }else if(v==buttont_context_Menu){

        menu.setHeaderTitle("我知道是什么了!");

        menu.add(2,2,2,"不是苹果");

        menu.add(2,3,3,"就是猕猴桃");    

       }

       super.onCreateContextMenu(menu, v, menuInfo);

      }

      //菜单单击响应

      @Override

      public boolean onContextItemSelected(MenuItem item){

       //获取当前被选择的菜单项的信息    

       switch(item.getItemId()){

        case 1:

         Toast toast=Toast.makeText(Context_Menu.this, "你点击了"+textView_context_Menu.getText(), Toast.LENGTH_LONG);

         toast.setGravity(Gravity.TOP, 100, 300);

         toast.show();

         break;

        case 3:

         Toast toast1=Toast.makeText(Context_Menu.this, "你点击了"+buttont_context_Menu.getText(), Toast.LENGTH_LONG);

         toast1.setGravity(Gravity.TOP, 100, 300);

         toast1.show();

         break;        

       }

       return true;

      }

     }

   ==========================================================================================================

     第四个例子:动态Menu

        此为动态Menu的实现 ,采用的是代码布局(非XML布局)。此种Memu用在什么情况下,具体该怎么做?

 

     public class Trends_Menu extends Activity{

      LinearLayout linearLayout;

      TextView textView;

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       linearLayout = new LinearLayout(this);

       linearLayout.setBackgroundColor(android.graphics.Color.BLUE);//设置背景色

       linearLayout.setOrientation(linearLayout.VERTICAL);//设置布局方向

        

       LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,

              LinearLayout.LayoutParams.WRAP_CONTENT);

              textView= new TextView(this);//创建TextView对象

       textView.setBackgroundColor(Color.YELLOW);//设置背景颜色

       textView.setText("Trends_Men");

       textView.setTextSize(50);

        //textView.setHeight(50);

        //textView.setWidth(100);

       textView.setTextColor(Color.RED);//设置字体颜色

 

       linearLayout.addView(textView,params);//将textView添加到linearLayout中去

       setContentView(linearLayout);//设置ui布局 

      }

      public boolean onPrepareOptionsMenu(Menu menu){

       String string = textView.getText().toString();

        if(string.equals("Trends_Menu")){

         menu.clear();//清掉菜单

         MenuItem item = menu.add(0,1,1,"to Menu");

         item.setIcon(android.R.drawable.alert_dark_frame);//android自带的图标

        }

        if(string.equals("Menu")){

         menu.clear();

         MenuItem item = menu.add(1,2,2,"to Trends_Menu");

         item.setIcon(android.R.drawable.alert_light_frame);

        }

         menu.add(0,2,2,"Now is"+string);

         return super.onPrepareOptionsMenu(menu); 

      }

     }

 

   ----------------------------------------------------------------------------------------------------------

   ListView 一个用来显示列表的控件

    xml设计

    代码设计

     第一个例子:

     public class ListView3 extends ListActivity{

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

 

      String[] string={"华中科技","天龙大厦","科技园","天天乐园"};//string 是用来要存放的数据

 

      //android.R.layout.simple_expandable_list_item_1为XML的配置文件, 用来设置列表中每一行的窗口

      setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,string));

      }

     }

     * 每一个ListActivity系统都会给他一个默认的系统布局,所以不需要设置setConteView(),

     * 但是我们也可以指定窗口的布局(如simpleadapter.com包中文件的配置文件simpleadapter1,2)

     * 在配置文件中要注意的是android:list 是系统自定义的不是随便可以取的,否则会出现找不到ListView

     ================================================================================================================

     第二个例子:

     textView_chrild.xml

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

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

      android:orientation="vertical"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent"

      >

      <TextView 

       android:id= "@+id/textView_chrild"

       android:layout_width="fill_parent"

       android:layout_height="fill_parent"

       android:paddingLeft="50px"

       android:paddingTop="5px"

       android:paddingBottom="5px"

       android:text="no date"

       android:textSize="30sp"

       />

     </LinearLayout>

     ---------------------------------------------------------------------------------------

     textView_group.xml

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

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

      android:orientation="vertical"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent"

      >

      <TextView 

       android:id= "@+id/textView_group"

       android:layout_width="fill_parent"

       android:layout_height="fill_parent"

       android:paddingLeft="60px"

       android:paddingTop="10px"

       android:paddingBottom="10px"

       android:text="no date"

       android:textSize="25sp"

      />

     </LinearLayout>

     -------------------------------------------------------------------------------------------

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

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

      android:orientation="vertical"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent"

      >

      <ExpandableListView 

       android:id= "@+id/android:list"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:drawSelectorOnTop="false"

      />

      <TextView 

       android:id= "@+id/android:empty"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:text="No date"

       />

     </LinearLayout>

     ---------------------------------------------------------------------------------------------

     public class MyActivity extends ExpandableListActivity{

      public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

        setContentView(R.layout.expandable);

      //定义一个List,该List对象为一级条目提供数据

      List<Map<String,String>> list1 = new ArrayList<Map<String,String>>();

      Map<String,String> map1 = new HashMap<String,String>();

      Map<String,String> map2 = new HashMap<String,String>();

       map1.put("list1", "map1");

       map2.put("list1", "map2");

       list1.add(map1);

       list1.add(map2);

      //定义一个List,该List对象为第一个一级条目 提供数据

      List<Map<String,String>> list21 = new ArrayList<Map<String,String>>();

      Map<String,String> map21 = new HashMap<String,String>();

      Map<String,String> map22 = new HashMap<String,String>();

       map21.put("list", "map21");

       map22.put("list", "map22");

       list21.add(map21);

       list21.add(map22);

      //定义一个List,该List对象为第二个一级条目提供数据

      List<Map<String,String>> list31 = new ArrayList<Map<String,String>>();

      Map<String,String> map31 = new HashMap<String,String>();

      //Map<String,String> map32 = new HashMap<String,String>();

       map31.put("list", "map31");

       //map32.put("ni shi", "fdsa");

       list31.add(map31);

       //list31.add(map2);

 

      //定义一个List,该List对象用来存储所有二级条目对象

      List<List<Map<String,String>>> list0 = new ArrayList<List<Map<String,String>>>();

       list0.add(list21);

       list0.add(list31);

 

      SimpleExpandableListAdapter simple = new SimpleExpandableListAdapter(

       this,//context

       list1,//一级条目数据

       R.layout.expandable_group,//用来设置一级条目样式的布局文件

       new String[]{"list1"}, //指定一级条目数据的Key

       new int[]{R.id.textView_group},//指定一级条目数据显示的控件id

       list0, //二级条目数据

       R.layout.expandable_chrild,//用来设置二级条目样式的布局文件

       new String[]{"list"}, //指定二级条目数据的Key

       new int[]{R.id.textView_chrild});//指定二级条目数据显示的控件id

 

      setListAdapter(simple);//将SimpleExpandableListAdapter对象设置给当前的Activity

      }

     }

     =========================================================================================================================

     第三个例子:自定义ListView

     public class ImageTextView extends LinearLayout{

      public TextView textView;

      public ImageView imageView;

     

      public ImageTextView(Context context, String string,Drawable drawable) {-----------------------------------* 注意这里并没用在xml定义控件

       super(context);

       // TODO Auto-generated constructor stub

       this.setOrientation(VERTICAL);//设置为水平布局

       imageView = new ImageView(context);

       imageView.setImageDrawable(drawable);

       imageView.setPadding(2, 5, 5, 0);//设置位置

       addView(imageView,new LinearLayout.LayoutParams(40,30));

      

       textView = new TextView(context);

       textView.setText("title");

       textView.setTextSize(20);

       addView(textView,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,30));

      

       textView = new TextView(context);

       textView.setText("title");

       textView.setTextSize(20);

       addView(textView,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,30));

      }

      * 这是一个线性布局的View,其中包含一个TextView 和一个ImageView.

      * 且为垂直布局

     }

     --------------------------------------------------------------------------------------------------------------------

     public class ListCombinAdapter extends BaseAdapter{--------------------------------------------------------------------------继承BaseAdapter 且必须重写五个函数

      private Context wcontext;

      private List<ImageTextView> list;

 

      public ListCombinAdapter(Context context){

       this.wcontext=context;

       list = new ArrayList<ImageTextView>();

      }

      @Override

      public int getCount() {

       return list.size();//得到List对象数组的大小

      }

      @Override

      public Object getItem(int position) {

       return list.get(position);//得到对象在List数组中的位置

      }

      @Override

      public long getItemId(int position) {

       return (long)position;

      }

      public long getPosition(Object item){

       return list.indexOf(item);//得到对象在list中的索引

      }

      @Override

      public View getView(int position, View convertView, ViewGroup parent) {//得到一个显示在屏幕上的View

       ImageTextView imageTextView;

       if(convertView == null){//判断原来的View是否存在 如果不存在利用ImageTextView创建一个View

        imageTextView = new ImageTextView(wcontext,(String)list.get(position).textView.getText(),list.get(position).imageView.getDrawable());

       }else{

        imageTextView = (ImageTextView)convertView;//强制转型

        imageTextView.textView = list.get(position).textView;

        imageTextView.imageView = list.get(position).imageView;

       }

       return imageTextView;

      }

      public void addItem(String text,Drawable drawable){

       list.add(new ImageTextView(wcontext,text,drawable));//将创建好的ImageTextView对象加入到list中去

      }

     }

     -------------------------------------------------------------------------------------------------------------------

     public class ListView4Activity extends ListActivity {//定制自己的adapter

      @Override

      public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       //setContentView(R.layout.main);//不需要此项

      ListCombinAdapter listCombinAdapter = new ListCombinAdapter(this);

      listCombinAdapter.addItem("不知道此处的字符串起什么作用",getResources().getDrawable(R.drawable.image2));

      listCombinAdapter.addItem("不知道此处的字符串起什么作用", getResources().getDrawable(R.drawable.image3));

      setListAdapter(listCombinAdapter);

      }

     }

     =================================================================================================================

     第四个例子:

     simpleadapter2.xml

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

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

      android:orientation="vertical"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent">

      <LinearLayout android:id="@+id/listLinearLayout"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:orientation="horizontal">

      <ListView android:id="@id/android:list"//注意此处是ListView在xml文件中的id形式为固定的否则将找不到------------ListView在XML文件中

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:drawSelectorOnTop="false"

       android:scrollbars="vertical" />

      </LinearLayout>

     </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:orientation="vertical"

      android:paddingLeft="10dip"

      android:paddingRight="10dip"

      android:paddingTop="1dip"

      android:paddingBottom="1dip">

      <TextView 

       android:id="@+id/user_name"         

       android:layout_width="180dip"

       android:layout_height="30dip"

       android:textSize="10pt"

       android:singleLine="true" />

      <TextView 

       android:id="@+id/user_ip"

       android:layout_width="fill_parent"

       android:layout_height="fill_parent"

       android:gravity="right"

       android:textSize="10pt" />

      </LinearLayout>

     ---------------------------------------------------------------------------------------------------------------------

     public class ListView1 extends ListActivity{//继承的是ListActivity

 

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();

        HashMap<String,String> map1 = new HashMap<String,String>();

        HashMap<String,String> map2 = new HashMap<String,String>();

        HashMap<String,String> map3 = new HashMap<String,String>();

         map1.put("user_name","张三");

         map1.put("user_ip", "第一名");

         map2.put("user_name","李四");

         map2.put("user_ip", "第二名");

         map3.put("user_name","王五");

         map3.put("user_ip", "第三名");

         list.add(map1);

         list.add(map2);

         list.add(map3);

      SimpleAdapter listAdapter = new SimpleAdapter(this,list,R.layout.simpleadapter2,

            new String[]{"user_name","user_ip"},new int[]{R.id.user_name,R.id.user_ip});

       setListAdapter(listAdapter);//调用ListActivity中的setListAdapter()方法设置显示ListView

      }

     }

     ----------------------------------------------------------------------------------------------------------------------

     * 此为ListActivity和listView数据适配器 。方法中的第一参数为当前对象,第二个参数为

     * 我们要映射成Mapd的List结构,第三个参数为每一行列表的布局(此处为一行显示两个listView)

     * 第四个参数是一个字符串数组,并规定了顺序,第五个参数是依次把第四个参数的文本隐射到listView的布局中去

     * 本适配器的格式也可为:(注意映射的顺序)

     * setListAdapter(new SimpleAdapter(this,list,R.layout.simpleadapter2,

            new String[]{"user_name","user_ip"},new int[]{R.id.user_name,R.id.user_ip}); 

     =======================================================================================================================

     第五个例子:通过ListView来显示电话本中信息。

      先创建LinearLayout对象和ListView对象,LinearLayout用来显示ListView

      然后通过ListAdapter将获得的电话本数据与ListView连接起来

      接着将ListAdapter添加到ListView中

      最后将ListView添加到Linearlayout中,让屏幕显示LinearLayout。

      要处理ListView事件需要为其添加setOnItemSelectedListener监听以及setOnItemClickListener监听

      例:

     public class ListView2 extends Activity{

      LinearLayout linearLayout;

      ListView listView1;

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       linearLayout = new LinearLayout(this);//创建LinearLayout布局对象----------------------------------------------------------在代码中创建LinearLayout

 

       linearLayout.setOrientation(linearLayout.VERTICAL);//设置方向

       linearLayout.setBackgroundColor(android.graphics.Color.BLUE);//设置背景色

 

       listView1 = new ListView(this);//创建ListView对象

       LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,

                       LinearLayout.LayoutParams.WRAP_CONTENT); 

       listView1.setBackgroundColor(Color.BLACK);

 

       linearLayout.addView(listView1,param);//添加listView到linearlayout中去

 

       setContentView(linearLayout);//设置显示LinearLayout布局

       //获取数据库Phones的Cursor

       Cursor cur = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);

       startManagingCursor(cur);

        //ListAdapter是ListView和后台数据的桥梁。

        //SimpleCursorAdapter是把数据中查询到的结果映射到listView中

 

       ListAdapter adapter = new SimpleCursorAdapter(this,

                  android.R.layout.simple_list_item_2,//表示每一行的布局包含两个数据项

                  cur,//数据库的Cursor对象

                  new String[]{PhoneLookup.DISPLAY_NAME,PhoneLookup.NUMBER},//从数据库的NAME和NUMBER两列中取数据

                  new int[]{android.R.id.text1,android.R.id.text2});//与NAME和NUMBER对应的Views

 

       listView1.setAdapter(adapter);//将adapter添加到listView中

 

       //在ListView中当鼠标滚动时会触发setOnItemSelectedListener

       listView1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){-------------------------------------------------为listView1的视图添加setOnItemSelectedListener监听

 

       @Override

        public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {

   

         DisplayToast("滚动到第"+Long.toString(arg0.getSelectedItemId())+"项");

        }

 

       @Override

        public void onNothingSelected(AdapterView<?> arg0) {

   

         //没有选中

        }  

       });

       //在ListView中当点击时会触发setClickListener

       listView1.setOnItemClickListener(new AdapterView.OnItemClickListener(){

 

       @Override

        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

   

         DisplayToast("选中了第"+Integer.toString(arg2+1)+"项");//对于选中的项进行处理

        }

       });

      }

      protected void DisplayToast(String string) {

       // TODO Auto-generated method stub

       Toast.makeText(this, string,Toast.LENGTH_SHORT).show();//显示Toast

       }

      }

        ========================================================================================================================== 

    Android 中关于Cursor类的介绍

     使用过SQLite 数据库的童鞋对Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成Ado.net 中的数据集合。

     关于Cursor 在你理解和使用Android Cursor 的时候你必须先知道关于Cursor 的几件事情:

     Cursor 是每行的集合。

      使用moveToFirst() 定位第一行。

      你必须知道每一列的名称。

      你必须知道每一列的数据类型。

      Cursor 是一个随机的数据源。

      所有的数据都是通过下标取得。

 

    关于Cursor 的重要方法:

     close()关闭游标,释放资源

     copyStringToBuffer(int columnIndex, CharArrayBuffer buffer)在缓冲区中检索请求的列的文本,将其存储

     getColumnCount()返回所有列的总数

      getColumnIndex(String columnName)返回指定列的名称,如果不存在返回-1

     getColumnIndexOrThrow(String columnName)从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。

     getColumnName(int columnIndex)从给定的索引返回列名

     getColumnNames()返回一个字符串数组的列名

     getCount()返回Cursor 中的行数

     moveToFirst()移动光标到第一行

     moveToLast()移动光标到最后一行

     moveToNext()移动光标到下一行

     moveToPosition(int position)移动光标到一个绝对的位置

     moveToPrevious()移动光标到上一行

     下面来看看一小段代码:

      if (cur.moveToFirst() == false){

       //为空的Cursor

       return;

      }

 

      访问Cursor 的下标获得其中的数据

      int nameColumnIndex = cur.getColumnIndex(People.NAME);

      String name = cur.getString(nameColumnIndex);

      现在让我们看看如何循环Cursor 取出我们需要的数据

      while(cur.moveToNext()){

       //光标移动成功

      //把数据取出

      }

      当cur.moveToNext() 为假时将跳出循环,即Cursor 数据循环完毕。

      如果你喜欢用for 循环而不想用While 循环可以使用Google 提供的几下方法:

       isBeforeFirst()返回游标是否指向之前第一行的位置

      isAfterLast()返回游标是否指向第最后一行的位置

      isClosed()如果返回true 即表示该游戏标己关闭

 

      有了以上的方法,可以如此取出数据

      for(cur.moveToFirst();!cur.isAfterLast();cur.moveToNext()){

       int nameColumn = cur.getColumnIndex(People.NAME);

       int phoneColumn = cur.getColumnIndex(People.NUMBER);

       String name = cur.getString(nameColumn);

       String phoneNumber = cur.getString(phoneColumn);

      }

     在Android 查询数据是通过Cursor 类来实现的。

     当我们使用SQLiteDatabase.query()方法时,就会得到Cursor对象,Cursor所指向的就是每一条数据。

     Cursor 位于android.database.Cursor类,可见出它的设计是基于数据库服务产生的。

      另外,还有几个己知的子类,分别为:

       AbstractCursor

       AbstractWindowedCursor

       CrossProcessCursor

       CursorWrapper

       MatrixCursor

       MergeCursor

       MockCursor

       SQLiteCursor

      具体详细的使用方法和解释可以去参照API

 

   Toast 是Android中一种快讯信息类

   Toast的实现很简单只有一行代码“Toast.makeText(this,String,Toast.LENGTH_SHORT).show();”

   下面为一个接受短信的例子,其中用到了Toast。

   toast.xml

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:orientation="vertical"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     >

     <TextView 

      android:id= "@+id/textView1"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="Toast示例"

      android:textSize="15pt"

      />

     <Button

      android:id= "@+id/button1"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="Toast"

      />

    </LinearLayout>

   --------------------------------------------------------------------------------------------------------------

    public class Toast1 extends Activity{

     public Button button1;

     public TextView textView1;

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.toast);

      textView1 =(TextView)findViewById(R.id.textView1);

      button1= (Button)findViewById(R.id.button1);

      button1.setOnClickListener(new Button.OnClickListener(){---------------------Button监听器

      @Override

        public void onClick(View v) {

       DisplayToast("短信在这里显示");     

       }  

      });

     }

     protected void DisplayToast(String string) {

       Toast.makeText(this,string,Toast.LENGTH_SHORT).show();

     }

    }

            ----------------------------------------------------------------------------------------------------------------

    public class SmsReceiver extends BroadcastReceiver{

     @Override

     public void onReceive(Context context, Intent intent) {

     Bundle bundle = intent.getExtras();//得到一个Bundle对象

     Object messages[] = (Object[]) bundle.get("pdus");//调用Bundle类中的get()方法得到Object的对象数组

     SmsMessage smsMessage[] = new SmsMessage[messages.length];//创建SmsMessage对象数组

      for(int n = 0;n<messages.length;n++){

       smsMessage[n]= SmsMessage.createFromPdu((byte[])messages[n]);//createFromPdu()此方法为SmsMessage类中的静态方法,其返回值为SmsMessage对象

      }

     //产生一个Toast  其中getMessageBody()为得到一个String类型的返回值

     Toast toast = Toast.makeText(context,"短信内容"+smsMessage[0].getMessageBody(),Toast.LENGTH_LONG);------------Toast的使用

      toast.setGravity(Gravity.TOP|Gravity.LEFT,0,200);//设置toast位置

      toast.show();//显示toast

     }

    }

   ---------------------------------------------------------------------------------------------------------------------

    本例中使用了短信的借口,必须在AndroidManifest.xml中声明其权限

    <receiver  android:name = ".SmsReceiver" android:enabled="true">

     <intent-filter>

      <action android:name="android.provider.Telephony.SMS_RECEIVED"/>

     </intent-filter>

    </receiver>

   =====================================================================================================================

   Dialog 对话框

    Android中实现对话框可以使用AlertDialog类,以及自己定义对话框。必要时还可以设置监听器。

    本例在XML文件中自定义对话框 以及使用AlertDialog来创建对话框

   dialog.xml

    <?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="wrap_content"

      android:orientation="vertical">

      <TextView

       android:id="@+id/username"

       android:layout_height="wrap_content"

       android:layout_width="wrap_content"

       android:layout_marginLeft="20dip"

       android:layout_marginRight="20dip"

       android:text="账号"

       android:gravity="left"

       android:textAppearance="?android:attr/textAppearanceMedium" />

           

      <EditText

       android:id="@+id/username"

       android:layout_height="wrap_content"

       android:layout_width="fill_parent"

       android:layout_marginLeft="20dip"

       android:layout_marginRight="20dip"

       android:scrollHorizontally="true"

       android:autoText="false"

       android:capitalize="characters"

       android:gravity="fill_horizontal"

       android:textAppearance="?android:attr/textAppearanceMedium" />

 

      <TextView

       android:id="@+id/password"

       android:layout_height="wrap_content"

       android:layout_width="wrap_content"

       android:layout_marginLeft="20dip"

       android:layout_marginRight="20dip"

       android:text="密码"

       android:gravity="left"

       android:textAppearance="?android:attr/textAppearanceSmall" />

            

      <EditText

       android:id="@+id/password"

       android:layout_height="wrap_content"

       android:layout_width="fill_parent"

       android:layout_marginLeft="20dip"

       android:layout_marginRight="20dip"

       android:scrollHorizontally="true"

       android:autoText="false"

       android:capitalize="none"

       android:gravity="fill_horizontal"

       android:password="true"

       android:textAppearance="?android:attr/textAppearanceInverse" />

     </LinearLayout>

 

    public class UserDialog_AlertDialog extends Activity{

     ProgressDialog progressDialog;//创建一个对话框中的进度条

 

      public void onCreate(Bundle savedInstanceState){

       super.onCreate(savedInstanceState);

       setContentView(R.layout.empty);//empty为一个空的布局文件

       //另一种书写形式在下面有解释

       Dialog dialog = new AlertDialog.Builder(UserDialog_AlertDialog.this)//通过AlertDialog创建对话框

           .setTitle("登陆提示")//设置标题

           .setMultiChoiceItems(new String[]{"第一章","第二章","第三章"}, null,null)//设置多选按钮

           //.setMessage("这里需要登陆")//设置内容

           .setPositiveButton("确定", new DialogInterface.OnClickListener() { //设置监听器

            @Override

             public void onClick(DialogInterface dialog, int which) {

              //为”确定“添加监听事件 创建自定义的对话框

             LayoutInflater inflater = LayoutInflater.from(UserDialog_AlertDialog.this);------------------------------------------LayoutInflater的运用

             final View DialogView = inflater.inflate(R.layout.dialog, null);//得到自定义对话框

   

             AlertDialog alertDialog = new AlertDialog.Builder(UserDialog_AlertDialog.this)

                    .setTitle("登陆框")

                    .setIcon(R.drawable.qq)//改变对话框图片

                    .setView(DialogView)//设置自定义的对话框的样式

                    .setPositiveButton("可以", new DialogInterface.OnClickListener() {//在自定义的对话框中创建监听器   

                     @Override

                     public void onClick(DialogInterface dialog, int which) {

                      progressDialog =ProgressDialog.show(UserDialog_AlertDialog.this, "请等待", "正在为你连接....",true);

                       new Thread(){

                        public void run(){

                         try{

                          sleep(3000);

                         }catch(Exception e){

                          e.printStackTrace();

                         }finally{

                          progressDialog.dismiss();//登录结束取消progressDialog对话框

                         }

                        }

                       }.start();

                      }

                    })

                    .setNegativeButton("不行", new DialogInterface.OnClickListener() {//设置取消

    

                     @Override

                     public void onClick(DialogInterface dialog, int which) {

                        // TODO Auto-generated method stub

                      UserDialog_AlertDialog.this.finish();

                     }

                    }).create();

                     alertDialog.show();  

             }

           })//设置确定按钮 

           .setNeutralButton("退出", new DialogInterface.OnClickListener() {//创建退出按钮

  

            @Override

            public void onClick(DialogInterface dialog, int which) {

             //UserDialog_AlertDialog.this.finish();//退出

             AlertDialog.Builder builder1 = new AlertDialog.Builder(UserDialog_AlertDialog.this);

             builder1.setTitle("单选框");//设置标题

             builder1.setSingleChoiceItems(new  String[]{"你好","他好","我也好"},  0, new DialogInterface.OnClickListener() {   

               @Override

              public void onClick(DialogInterface dialog, int which) {    

               AlertDialog.Builder builder2 = new AlertDialog.Builder(UserDialog_AlertDialog.this);

               builder2.setTitle("普通列表项");

               builder2.setItems(new String[]{"我只是普通列表项","我从第一层的退出项来的"}, null);//设置普通列表项

               builder2.create().show();//创建与显示     

              }

             });

             builder1.setIcon(R.drawable.image2);//设置图片

             builder1.create().show();//创建与显示

            }

           }).create();

           dialog.show();//显示对话框

      }

    }

 

   另一种创建对话框的方法dialog()

    protected void dialog() {

     AlertDialog.Builder builder = new Builder(Main.this);

     builder.setMessage("确认退出吗?");

     builder.setTitle("提示");

     builder.setPositiveButton("确认", new OnClickListener() {

      @Override

      public void onClick(DialogInterface dialog, int which) {

       dialog.dismiss();

       Main.this.finish();

      }

     });

     builder.setNegativeButton("取消", new OnClickListener() {

      @Override

      public void onClick(DialogInterface dialog, int which) {

       dialog.dismiss();

      }

     });

     builder.create().show();

    }

 

   也可以在onKeyDown(int keyCode, KeyEvent event)方法中调用此方法

    public boolean onKeyDown(int keyCode, KeyEvent event) {

     if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

       dialog();

     }

      return false;

    }

   =========================================================================================================================

   ImageView 将一张图片显示在屏幕上,需要创建一个显示图片的对象,Android中这个对象就是ImageView.下面例中设计ImageView图片然后

     再通过线程对其Alpha进行更改。

   imageview_handler.xml

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:orientation="vertical"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     >

     <ImageView 

      android:id= "@+id/imageView_handler"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

     />

     <TextView 

      android:id= "@+id/textView_handler"

      android:layout_below="@id/imageView_handler"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

     />

    </LinearLayout>

 

    public class ImageView_Handler extends Activity{

     public TextView textView_handler;

     public ImageView imageView_handler;

     public boolean flag= false;//线程是否执行标志位

     Handler handler = new Handler();----------------------------------------------Handler的运用

     public int image_alpha = 255;//ImageView的透明度

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.imageview_handler);

      flag = true;//初始化线程标志位

      imageView_handler = (ImageView)findViewById(R.id.imageView_handler);

      textView_handler = (TextView)findViewById(R.id.textView_handler);

 

      imageView_handler.setImageResource(R.drawable.ee);//设置imageView的图片资源也可在xml文件中如下书写

      //android:src= "@drawable/ee"

      imageView_handler.setAlpha(image_alpha);//设置图片的透明度

      //创建一个线程来更新Alpha值

      handler = new Handler(){//接受更新后的消息

       public void handleMessage(Message msg){

        super.handleMessage(msg);

        imageView_handler.setAlpha(image_alpha);

        textView_handler.setText("当前Alpha值为:"+Integer.toString(image_alpha));

   

        imageView_handler.invalidate();//更新  此行代码是用来更新View的 。在这个例子中我不用效果是一样的为什么在这我要加上他呢?不懂

       }

      };

      new Thread(new Runnable(){

 

       @Override

       public void run() {

        while(flag){

         try{

          Thread.sleep(200);

          updateAlpha();//更新Alpha值

         }catch(InterruptedException e){

          e.printStackTrace();

         }  

        }

       }

      }).start();

     }

     protected void updateAlpha() {

      if(image_alpha>0){

       image_alpha-=10;

      }else {

       image_alpha =0;

       flag = false;//线程停止更新

      }

       handler.sendMessage(handler.obtainMessage());//发送Alpha更新的消息

     }

    }

   ===================================================================================================================================

   Gallery  拖动效果

   gallery.xml

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

     <Gallery xmlns:android="http://schemas.android.com/apk/res/android"

      android:id="@+id/gallery1"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent"

     />

 

   * BaseAdapter继承自Adapter为Android中用到基础数据适配器,主要用途是将一组数据传到ListView,

   * Gallery,Spinner,GridView等UI显示组件,其中getView是将获取后的组件View返回给UI,如ListView每一行

   * 中TextView,以及Gallery中的每个ImageView。BaseAdapter相当于数据源与UI中的桥梁

 

    public class Gallery_Adapter extends BaseAdapter{//通过继承BaseAdapter来装载这些图片

     private Context context;//定义context  后面有解释  具体意思不是很清楚?

      private Integer[] tId={

       R.drawable.t1,

       R.drawable.t2,

       R.drawable.t3,

       R.drawable.t4,

       R.drawable.t5,

       R.drawable.t6,

       R.drawable.t7,

       R.drawable.t8,

       R.drawable.t9,

       R.drawable.t10,

       R.drawable.t11,

       R.drawable.t12,

      };

     //声明Gallery_Adapter

     public Gallery_Adapter(Context context){//构造器

      this.context=context;

     }

      @Override

     public int getCount() {//获取图片的个数

      // TODO Auto-generated method stub

      return tId.length;

     }

      @Override

     public Object getItem(int position) {//获取图片在数组中位置

       // TODO Auto-generated method stub

      return position;

     }

     @Override

     public long getItemId(int position) {//获取图片在数组中位置

      // TODO Auto-generated method stub

      return position;

     }

     @Override

     public View getView(int position, View convertView, ViewGroup parent) {

      // TODO Auto-generated method stub

      ImageView imageView = new ImageView(context);-------------------------------ImageView对象在代码中实现

      imageView.setImageResource(tId[position]);//给ImageView设置要显示的图片资源

      imageView.setLayoutParams(new Gallery.LayoutParams(80,80));//设置布局图片以120*120显示

      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);//设置显示比例类型

      return imageView;//返回数据库中的imageView资源给UI

     }

    }

   /*

   * Context字面意思是上下文,位于framework package的android.content.Context中,其实该类

   * 为LONG型,类似Win32中的Handle句柄。很多方法需要通过Context才能识别调用者的实例:比如

   * 说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例

   * 为Activity,而到了一个button的onClick(View view)等方法时,我们用this时就会报错,所以

   * 我们可能使用ActivityName.this来解决,主要原因是因为实现Context的类主要有Android特有

   * 的几个模型,Activity以及Service。

 

   Context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。

   它允许获取以应用为特征的资源和类型。同时启动应用级的操作,如启动Activity,broadcasting和

   接收intents。

   * */

 

    public class Gallery_BaseAdapter extends Activity{

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.gallery);

      Gallery gallery = (Gallery)findViewById(R.id.gallery1);//获取Gallery对象

 

      gallery.setAdapter(new Gallery_Adapter(this));//将Gallery_Adapter添加到Gallery对象中去

      gallery.setBackgroundResource(R.drawable.bj);//设置Gallery背景

  

      //设置监听事件

      gallery.setOnItemClickListener(new OnItemClickListener() {--------------------------------------------------------Gallery监听器

 

       @Override

       public void onItemClick(AdapterView<?> arg0, View v, int position,

          long arg3) {

       // TODO Auto-generated method stub

       Toast.makeText(Gallery_BaseAdapter.this, "你选择了"+(position+1)+"号图片", Toast.LENGTH_LONG)

       .show();

       }  

      });

     }

    }

   ==========================================================================================================================

   ImageSwitcher  切换图片

    ImageSwitcher类必须设置一个ViewFactory,主要用来将显示的图片和父窗口区分开,所有要实现ViewSwitcher.ViewFactory接口,通过makeView()

    方法来显示图片,这里会返回一个ImageView对象,在通过setImageResource用来显示指定的图片资源。

   

    public class ImageSwitch_LinearLayout extends Activity implements ViewFactory, OnClickListener{

     private static final int BUTTON_DWON_ID = 1;//下一页按钮ID  注意此处数组1,2,3我是随便取的此处还不是很清楚

     private static final int BUTTON_UP_ID = 2;//上一页按钮ID

     private static final int SWITCH_ID =3;//ImageSwitch对象的ID

 

     private static int index = 0;//设置图片资源数组的索引

     ImageSwitcher imageSwitcher;

 

     private static final Integer[] integer ={//所要显示的图片资源数组

        R.drawable.t1,

        R.drawable.t2,

        R.drawable.t3,

        R.drawable.t4,

        R.drawable.t5,

        R.drawable.t6,

     };

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

 

      LinearLayout linearLayout = new LinearLayout(this);//创建一个线性布局

      linearLayout.setOrientation(LinearLayout.VERTICAL);

       imageSwitcher = new ImageSwitcher(this);//创建一个ImageSwitcher对象

       linearLayout.addView(imageSwitcher);//在线性布局中添加imageSwitcher视图

       imageSwitcher.setId(SWITCH_ID);//为ImageSwitcher对象设置Id

        //为imageSwitcher对象设置数据源

       imageSwitcher.setFactory(this);

       imageSwitcher.setImageResource(integer[index]);

       setContentView(linearLayout);//设置显示上面创建的线性布局

 

       Button button1 = new Button(this);//创建上一页按钮

        button1.setId(BUTTON_UP_ID);

        button1.setText("上一页");

        button1.setOnClickListener(this);//创立监听器

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(100,100);//设置Button按钮的宽 ,高

        params.gravity = Gravity.CENTER;//设置控件的相对屏幕的布局 ,不是控件中的文字相对控件的布局

        linearLayout.addView(button1,params);//将button1 加入到线性布局中去

 

       TextView textView1 = new TextView(this);

        textView1.setId(BUTTON_DWON_ID);

        textView1.setText("下一页");

        textView1.setGravity(Gravity.CENTER);//设置文字权重

        textView1.setBackgroundColor(Color.RED);

        textView1.setTextColor(Color.BLUE);

       

       textView1.setOnClickListener(this);

       LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(100,100);

         params2.gravity = Gravity.CENTER;//设置控件的相对屏幕的布局 ,不是控件中的文字相对控件的布局

         linearLayout.addView(textView1,params2);

     }

     @Override

     public View makeView() {

      // TODO Auto-generated method stub

      return new ImageView(this);//将所有图片通过ImageView来显示

     }

     @Override

     public void onClick(View view) {

      // TODO Auto-generated method stub

      switch(view.getId()){

       case BUTTON_UP_ID:

        index ++;

        if(index>=integer.length){

         index = 0;

        }

        imageSwitcher.setImageResource(integer[index]);//用此方法显示指定图片

        break;

       case BUTTON_DWON_ID:

        index --;

        if(index<=0){

         index = integer.length-1;

        }

        imageSwitcher.setImageResource(integer[index]);

        break;

       default:

        break;

      }

     }

 

    }

   =======================================================================================================================

   GridView 网格视图

    当有多个元素要显示时,就需要使用BaseAdapter来存储。

  

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

    <GridView xmlns:android="http://schemas.android.com/apk/res/android"

     android:id="@+id/gridview1"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     android:numColumns="auto_fit"

     android:verticalSpacing="10dp"

     android:horizontalSpacing="10dp"

     android:columnWidth="90dp"

     android:stretchMode="columnWidth"

     android:gravity="center"

    />

   

    public class GridView_BaseAdapter extends BaseAdapter{

 

   * BaseAdapter继承自Adapter为Android中用到基础数据适配器,主要用途是将一组数据传到ListView,

   * Gallery,Spinner,GridView等UI显示组件,其中getView是将获取后的组件View返回给UI,如ListView每一行

   * 中TextView,以及Gallery中的每个ImageView。BaseAdapter相当于数据源与UI中的桥梁

 

     private Context context;//定义context  后面有解释  具体意思不是很清楚?

      private Integer[] tId={

       R.drawable.t1,

       R.drawable.t2,

       R.drawable.t3,

       R.drawable.t4,

       R.drawable.t5,

       R.drawable.t6,

       R.drawable.t7,

       R.drawable.t8,

  

      };

      //声明Gallery_Adapter

     public GridView_BaseAdapter(Context context){//构造器

      this.context=context;

     }

     @Override

     public int getCount() {//获取图片的个数

      // TODO Auto-generated method stub

      return tId.length;

     }

     @Override

     public Object getItem(int position) {//获取图片在数组中位置

      // TODO Auto-generated method stub

      return position;

     }

     @Override

     public long getItemId(int position) {//获取图片在数组中位置

      // TODO Auto-generated method stub

      return position;

     }

     @Override

     public View getView(int position, View convertView, ViewGroup parent) {

      // TODO Auto-generated method stub

      ImageView imageView;

      if(convertView ==null){//判断原来View是否为空 ,如果为空就创建 如果不为空就把原来的转为自己的View

       imageView = new ImageView(context);

  

        //注意:此行代码一加就会出现错误。原因是LayoutParams是对上一层控件的设置(即对父控件的设置),而此处ImageView已经是最上层控件了。

        //imageView.setLayoutParams(new Gallery.LayoutParams(80,80));//设置布局图片以80*80显示

        imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);//设置显示比例类型

      }else{

        imageView = (ImageView)convertView;

      }

      imageView.setImageResource(tId[position]);//给ImageView设置资源

       return imageView;//返回数据库中的imageView资源给UI

     }

    }

 

    public class GridView_Adapter extends Activity{

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.gridview_baseadapter);

 

      GridView gridView12 = (GridView)findViewById(R.id.gridview1);

      gridView12.setAdapter(new GridView_BaseAdapter(this));//添加元素到gridView中去

      gridView12.setBackgroundResource(R.drawable.yj);//设置Gallery背景色

 

      gridView12.setOnItemClickListener(new OnItemClickListener(){-----------------------------------------------------------GridView监听器

 

       @Override

       public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,

            long arg3){

         // TODO Auto-generated method stub

        Toast.makeText(GridView_Adapter.this, "你选择了"+arg2+"号图片按钮",Toast.LENGTH_LONG ).show();

       }  

      });

     }

    }

   ====================================================================================================================================================

   ScrollView 卷轴视图

    是指当拥有的很多内容,一屏显示不完时,需要通过滚动来显示视图。(如文字过长时)。下面这个例子当我们点击Button时自动产生多个类似项,如果一屏显示不完,则

    通过ScrollView来显示。

    scrollview.xml

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

     android:id="@+id/scrollView1"

     android:layout_width="fill_parent"

     android:layout_height="wrap_content"

     android:scrollbars="none">

     <LinearLayout

      android:id="@+id/linearLayout_ScrollView"

      android:orientation="vertical"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content">

     <TextView

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="TextView0"/>

     <Button

      android:id="@+id/button_ScrollView"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="Button0"/>

     </LinearLayout>

    </ScrollView>

 

   * 问题:下面注释掉的部分没理解  注释掉得部分是为了实现循环滚动  ,但出现了问题?

   * ScrollView是在屏幕显示不下的时候出现滚动条,但注意不要在ScrollView中放多个组件,否则会出现

   * ERROR/AndroidRuntime(271): Caused by: java.lang.IllegalStateException: ScrollView can host only one direct child

   * (ScrollView只能包裹一个直接子元素)

 

    public class Scroll_View extends Activity{

     public ScrollView scrollView1;

     public LinearLayout linearLayout_ScrollView;

     public Button button01;

     public Handler handler = new Handler();//使用Handler来更新布局高度,即跳转到新增的控件中去

 

     public int index = 1;

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.scrollview);

      scrollView1 = (ScrollView)findViewById(R.id.scrollView1);

      linearLayout_ScrollView = (LinearLayout)findViewById(R.id.linearLayout_ScrollView);

      button01 = (Button)findViewById(R.id.button_ScrollView);

 

       //设置监听器

      button01.setOnClickListener(button02);

      //button01.setOnKeyListener(N);//改变默认焦点

     }

     public Button.OnClickListener button02 = new Button.OnClickListener(){

      @Override

      public void onClick(View v) {

       // TODO Auto-generated method stub

       EditText editText = new EditText(Scroll_View.this);

       editText.setText("NI HAO"+index++);

       LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(

          LinearLayout.LayoutParams.FILL_PARENT,

          LinearLayout.LayoutParams.WRAP_CONTENT);

       linearLayout_ScrollView.addView(editText,params);

  

       //editText.setOnKeyListener(M);//设置监听,改名默认焦点切换

       handler.post(msg);//投递一个消息

      }

     };

     public Runnable msg = new Runnable(){------------------------------------------------------------------------Runnable的使用

      public void run(){

      //此处作用是是屏幕跳到新加的一行当中去

      //例如:如果新加一个EditText,运行效果就向上滚动一个EditText的宽度,如果超出整

      //个屏幕N个EditText 就理解为屏幕最下方显示新增加的第N+1个EditText 依次向上为N,N-1

      //N-2,N-3。而原来的第一个已不可见

      int off = linearLayout_ScrollView.getMeasuredHeight()-scrollView1.getHeight();

       if(off>0){

        scrollView1.scrollTo(0,off);

       }

      }

     };

     // public View.OnKeyListener M = new View.OnKeyListener() {//事件监听

     // 

     //  @Override

     //  public boolean onKey(View v, int keyCode, KeyEvent event) {

     //   // TODO Auto-generated method stub

     //   if(keyCode ==KeyEvent.KEYCODE_DPAD_DOWN&&

     //     event.getAction() == KeyEvent.ACTION_DOWN&&

     //     v == linearLayout_ScrollView.getChildAt(linearLayout_ScrollView.getChildCount()-1)){

     //    findViewById(R.id.button1).requestFocus();

     //   }

     //   return false;

     //  }

     // };

     // public View.OnKeyListener N = new View.OnKeyListener() {

     // 

     //  @Override

     //  public boolean onKey(View v, int keyCode, KeyEvent event) {

     //   // TODO Auto-generated method stub

     //   View view = null;

     //   if(event.getAction()== KeyEvent.ACTION_DOWN){

     //    int A = linearLayout_ScrollView.getChildCount();

     //    switch(keyCode){

     //    case KeyEvent.KEYCODE_DPAD_UP:

     //     if(A>0){

     //      view = linearLayout_ScrollView.getChildAt(A-1);

     //     }

     //     break;

     //    case KeyEvent.KEYCODE_DPAD_DOWN:

     //     if(A<linearLayout_ScrollView.getWeightSum()){

     //      view = linearLayout_ScrollView.getChildAt(A);

     //     }

     //     break;

     //     default:

     //      break;

     //    }

     //   }

     //   if(view !=null){

     //    view.requestFocus();

     //    return true;

     //   }else{

     //    return false;

     //   }

     //  }

     // };

    }

   =======================================================================================================================================

   ProgressBar 进度条

   progressbar.xml

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:orientation="vertical"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     >

     <Button

      android:id="@+id/button_bar"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:text="打开progressbar"

     />

     <ProgressBar

      android:id="@+id/progressbar01"

      android:layout_width="300dp"

      android:layout_height="wrap_content"

      android:visibility="gone"

      style="?android:attr/progressBarStyleHorizontal"//长形进度条

     />

     <ProgressBar

      android:id="@+id/progressbar02"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:max="100"

      android:secondaryProgress="70"

      android:progress="50"

      android:visibility="gone"

      style="?android:attr/progressBarStyleLarge"//圆形进度条

     />

    </LinearLayout>

 

   * 本例有一个问题如何使标题栏中的进度条在走完后 变为不可现?

    public class ProgressBar_Handler extends Activity{

     public ProgressBar progressbar01;

     public ProgressBar progressbar02;

     public Button button_bar;

 

     public int count = 0;

     public static final int   STOP  = 0;

     public static final int  CURRENT = 1;

 

    public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

 

      requestWindowFeature(Window.FEATURE_PROGRESS);//设置窗口模式,因为需要显示进度条在标题栏

      setProgressBarVisibility(true);

 

      setContentView(R.layout.progressbar);

 

      progressbar01 = (ProgressBar)findViewById(R.id.progressbar01);

      progressbar02 = (ProgressBar)findViewById(R.id.progressbar02);

      button_bar = (Button)findViewById(R.id.button_bar);

 

      progressbar01.setIndeterminate(false);

      progressbar02.setIndeterminate(false);

 

      button_bar.setOnClickListener(new Button.OnClickListener(){

 

      @Override

      public void onClick(View v) {

       // TODO Auto-generated method stub

   

       progressbar01.setVisibility(View.VISIBLE);//设为可见状态

       progressbar02.setVisibility(View.VISIBLE);

   

       progressbar01.setMax(100);//设置最大值

   

       progressbar01.setProgress(0);//设置当前值

       progressbar02.setProgress(0);

       progressbar01.setSecondaryProgress(80);//设置第二进度值

   

       new Thread(new Runnable() {

    

        @Override

        public void run() {

         // TODO Auto-generated method stub

         for(int i=0;i<200;i++){      

          try{

           count = i*1;

           Thread.sleep(10);

          if(i==98){

           Message m = new Message();

           m.what = ProgressBar_Handler.STOP;

           ProgressBar_Handler.this.handler.sendMessage(m);       

          }else{

           Message m = new Message();-----------------------------------------------------------------更新进度条的方法

           m.what = ProgressBar_Handler.CURRENT;

           ProgressBar_Handler.this.handler.sendMessage(m);

          }

          }catch(Exception e){

           e.printStackTrace();      

          }

         }

        }

       }).start();

      }});

     }

     Handler handler = new Handler(){

      public void handleMessage(Message msg){

       switch(msg.what){

        case ProgressBar_Handler.STOP:

         progressbar01.setVisibility(View.GONE);

         progressbar02.setVisibility(View.GONE);

         //setVisible(false);

         Thread.currentThread().interrupt();

         break;

        case ProgressBar_Handler.CURRENT:

         if(!Thread.currentThread().isInterrupted()){

          progressbar01.setProgress(count);

          progressbar01.setSecondaryProgress(count+20);

          progressbar02.setProgress(count);

    

         setProgress(count*100);//设置标题栏中前面的一个进度条进度值

         setSecondaryProgress(count*100+30);//设置标题栏中后面的一个进度条进度值

         }

         break;

       }

       super.handleMessage(msg);

      }

     };

    }

   ========================================================================================================================================

   SeekBar 拖动条

    作用:如音量调节等。要实现监听就需要实现SeekBar.OnSeekChangeListener接口。在SeekBar中需要监听3个事件,他们是:

    在变化(onProgressChanged)在此可得到当前数值

    开始拖动(onStartTrackingTouch),

    停止拖动(onStopTrackingTouch)。

    seekBar.xml

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:orientation="vertical"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     >

     <SeekBar 

      android:id= "@+id/seekBar"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:max="100"

      android:progress="50"

      android:secondaryProgress="75"

     />

     <TextView 

      android:id="@+id/textView1_SeekBar"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

     />

     <TextView

      android:id="@+id/textView2_SeekBar"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="共选"

     />

    </LinearLayout>

 

    public class SeekBar1 extends Activity implements OnSeekBarChangeListener{

     public SeekBar seekBar;

     public TextView textView1_SeekBar;

     public TextView textView2_SeekBar;

 

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.seekbar);

      seekBar = (SeekBar)findViewById(R.id.seekBar);

      textView1_SeekBar = (TextView)findViewById(R.id.textView1_SeekBar);

      textView2_SeekBar = (TextView)findViewById(R.id.textView2_SeekBar);

 

      seekBar.setOnSeekBarChangeListener(this);//为seekBar设置监听器--------------------------------------------------------SeekBar监听器

     }

     @Override

     public void onProgressChanged(SeekBar seekBar, int progress,//位置改变

        boolean fromUser) {

      // TODO Auto-generated method stub

      textView1_SeekBar.setText("当前值"+progress);

     }

     @Override

     public void onStartTrackingTouch(SeekBar seekBar) {//开始拖到

      // TODO Auto-generated method stub

      textView2_SeekBar.setText("正在调解");

     }

     @Override

     public void onStopTrackingTouch(SeekBar seekBar) {//停止拖动

      // TODO Auto-generated method stub

      textView2_SeekBar.setText("停止调解");

     }

    }

   =====================================================================================================================================================

   Notification和NoticationManager状态栏提示

    当有未接电话,或电话时,在Android状态栏中就会出现一个小图标,如果下拉状态栏就可以展开看到快讯通知。下面这个例子需要俩个Activity。

    notification1_manager.xml

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

      android:orientation="vertical"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent"

      >

      <TextView

       android:id="@+id/textView_Manager"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="我是怎么出来的?我是Notification_Manager"

      />

    </LinearLayout>

 

    notification2_manager.xml

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:orientation="vertical"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     >

     <Button

      android:id="@+id/button1_notification"

      android:layout_height="wrap_content"

      android:layout_width="wrap_content"

      android:text="通知_发出默认声音"

     />

     <Button

      android:id="@+id/button2_notification"

      android:layout_height="wrap_content"

      android:layout_width="wrap_content"

      android:text="通知_发出震动"

     />

     <Button

      android:id="@+id/button3_notification"

      android:layout_height="wrap_content"

      android:layout_width="wrap_content"

      android:text="通知_屏幕发亮"

     />

     <Button

      android:id="@+id/button4_notification"

      android:layout_height="wrap_content"

      android:layout_width="wrap_content"

      android:text="通知_发出声音,发亮,震动"

     />

    </LinearLayout>

 

    public class Notification_Manager extends Activity{

     public TextView textView_manager;

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.notification1_manager);

      textView_manager =(TextView)findViewById(R.id.textView_Manager);

 

      textView_manager.setOnClickListener(new TextView.OnClickListener(){

 

       @Override

       public void onClick(View v) {

        // TODO Auto-generated method stub

        Intent intent = new Intent();

        intent.setClass(Notification_Manager.this, Notification2_Manager.class);

        startActivity(intent);

        Notification_Manager.this.finish();

       }

      });

     }

    }

 

    public class Notification2_Manager extends Activity{

     public Button button1_notification,

      button2_notification,

      button3_notification,

      button4_notification;

     NotificationManager notificationManager;//声明通知消息管理器Android系统提供NotificationManager来管理状态栏消息,

      Intent intent;

      PendingIntent pendingIntent;

     Notification notification;  //Android系统提供Notification来处理这些快讯信息,可以对Notification的内容,图标,标题等进行设置

 

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.notification2_manager);

      //初始化notification对象

      notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);//通过getSystemService来获得NotficationManger对象

      //构造Notification对象

      notification = new Notification();

 

      button1_notification =(Button)findViewById(R.id.button1_notification);

      button2_notification =(Button)findViewById(R.id.button2_notification);

      button3_notification =(Button)findViewById(R.id.button3_notification);

      button4_notification =(Button)findViewById(R.id.button4_notification);

 

      intent = new Intent(Notification2_Manager.this,Notification_Manager.class);//点击通知转移内容

      //设置点击通知时显示内容的类。Penging中文意思就是:待定,将来发生或来临。

      //PendingIntent不是像Intent那样立即发生,而是在合适的时候才会去触发对应的Intent

      pendingIntent = PendingIntent.getActivity(Notification2_Manager.this,0,intent, 0);

 

      button1_notification.setOnClickListener(new Button.OnClickListener(){

 

       @Override

       public void onClick(View v) {

        // TODO Auto-generated method stub

        notification.icon =R.drawable.qq;//设置通知在状态栏的图标

        notification.tickerText ="我是QQ";//当我们点击通知时显示的内容

 

        notification.defaults =notification.DEFAULT_SOUND;//通知发出默认的声音

   

        //设置通知显示的参数(这两参数下拉可以看见)

        notification.setLatestEventInfo(Notification2_Manager.this,"发出默认的声音","声音",pendingIntent);

        notificationManager.notify(0,notification);//可以理解执行这个通知

       }});

      button2_notification.setOnClickListener(new Button.OnClickListener(){

  

       @Override

       public void onClick(View v) {

        // TODO Auto-generated method stub

        notification.icon =R.drawable.qq;//设置通知在状态栏的图标

        notification.tickerText ="我是QQ";//当我们点击通知时显示的内容

 

        notification.defaults =notification.DEFAULT_VIBRATE;//通知发出震动

 

        //设置通知显示的参数(这两参数下拉可以看见)

        notification.setLatestEventInfo(Notification2_Manager.this,"发出震动","震动",pendingIntent);

        notificationManager.notify(0,notification);//通过notify来执行Notification快讯,可以理解执行这个通知。

       }});

      button3_notification.setOnClickListener(new Button.OnClickListener(){

 

       @Override

       public void onClick(View v) {

        // TODO Auto-generated method stub

        notification.icon =R.drawable.qq;//设置通知在状态栏的图标

        notification.tickerText ="我是QQ";//当我们点击通知时显示的内容

   

        notification.defaults =notification.DEFAULT_LIGHTS;//通知时屏幕发亮

   

        //设置通知显示的参数(这两参数下拉可以看见)

        notification.setLatestEventInfo(Notification2_Manager.this,"屏幕发亮","发亮",pendingIntent);

        notificationManager.notify(0,notification);//可以理解执行这个通知

       }});

      button4_notification.setOnClickListener(new Button.OnClickListener(){

  

       @Override

       public void onClick(View v) {

        // TODO Auto-generated method stub

        notification.icon =R.drawable.qq;//设置通知在状态栏的图标

        notification.tickerText ="我是QQ";//当我们点击通知时显示的内容

   

        notification.defaults =notification.DEFAULT_ALL;//通知发出默认的声音,发亮,震动

   

        //设置通知显示的参数(这两参数下拉可以看见)

        notification.setLatestEventInfo(Notification2_Manager.this,"声音,发亮,震动","3者都有",pendingIntent);

        notificationManager.notify(0,notification);//可以理解执行这个通知

       }});

     }

    }

   ======================================================================================================================================

   ProgressDialog 对话框中的进度条的

    可以通过如下方法对PogressDialog进行设置

    setProgressDialog //设置进度条风格

    setTitle:        //设置标题

    setMessage       //设置提示信息

    setIcon         //设置标题图标

    setIndeterminate//设置进度条是否不明确

    setCancelable  //设置是否可以按退回按键取消

    setButton    //设置一个Button需要监听Button事件

    show   //显示进度条

   

    progressdialog.xml

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

    <LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android" 

     android:orientation="horizontal"  

     android:layout_width="fill_parent"  

     android:layout_height="fill_parent"  

     android:padding="10dp"  

     >  

     <Button 

      android:id="@+id/button1_dialog"  

      android:layout_width="wrap_content"  

      android:layout_height="wrap_content"  

      android:text="长形进度条" 

     />  

     <Button 

      android:id="@+id/button2_dialog"  

      android:layout_width="wrap_content"  

      android:layout_height="wrap_content"  

      android:textColor="#FFF" 

      android:text="圆形进度条"

     />  

    </LinearLayout> 

 

    public class Progress_Dialog extends Activity{

     public Button button1_Dialog;

     public Button button2_Dialog;

     ProgressDialog progressDialog;//声明进度条对话框

     private int count;

 

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.progressdialog);

      button1_Dialog = (Button)findViewById(R.id.button1_dialog);

      button2_Dialog = (Button)findViewById(R.id.button2_dialog);

 

      button1_Dialog.setOnClickListener(new Button.OnClickListener(){

       @Override

       public void onClick(View v) {

        // TODO Auto-generated method stub

        //创建ProgressDialog对象

        progressDialog = new ProgressDialog(Progress_Dialog.this);

        //设置进度长形进度条风格

        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        //设置进度条标题

        progressDialog.setTitle("长形进度条");

        //设置提示信息

        progressDialog.setMessage("如何改变其图片与形式");

        //设置标题图标

        progressDialog.setIcon(R.drawable.qq);

        //设置进度条是否明确

        progressDialog.setIndeterminate(false);

        //设置是否可以按退出按键取消

        progressDialog.setCancelable(true);

        //设置进度条的一个Button按钮

        progressDialog.setButton("确定", new DialogInterface.OnClickListener() {

    

         @Override

         public void onClick(DialogInterface dialog, int which) {

          // TODO Auto-generated method stub

          dialog.cancel();//点击确定按钮取消对话框

         }

        });

        //显示进度条

        progressDialog.show();

       }});

      button2_Dialog.setOnClickListener(new Button.OnClickListener(){ 

       @Override

       public void onClick(View v) {

        // TODO Auto-generated method stub

        //创建ProgressDialog对象

        progressDialog = new ProgressDialog(Progress_Dialog.this);

        //设置进度条风格

        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

        //设置进度条标题

        progressDialog.setTitle("圆形进度条");

        //设置提示信息

        progressDialog.setMessage("如何改变其图片与形式");

        //设置标题图标

        progressDialog.setIcon(R.drawable.qq);

        //设置进度条是否明确

        progressDialog.setIndeterminate(false);

        //设置是否可以按退出按键取消

        progressDialog.setCancelable(true);

        //设置进度条的一个Button按钮

        progressDialog.setButton("确定", new DialogInterface.OnClickListener() {

    

         @Override

         public void onClick(DialogInterface dialog, int which) {

          // TODO Auto-generated method stub

          dialog.cancel();//点击确定按钮取消对话框

         }

        });

        //显示进度条

        progressDialog.show();

         new Thread(){

          public void run(){

          try{

           while(count <=100){

            progressDialog.setProgress(count++);//由线程来控制进度值

            Thread.sleep(100);

           }

           progressDialog.cancel();

          }catch(InterruptedException e){

           progressDialog.cancel();

          }

          }

         }.start();

       }});

      }

    }

   ==================================================================================================================================================

 3.3  LayoutInflater

    layoutinflater.xml

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

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

     android:orientation="vertical"  

     android:layout_width="fill_parent"  

     android:layout_height="fill_parent"  

     >  

     <TextView    

      android:layout_width="fill_parent"   

      android:layout_height="wrap_content"   

      android:text="@string/hello"  

     />  

     <Button  

      android:id="@+id/button"  

      android:layout_width="wrap_content"  

      android:layout_height="wrap_content"  

      android:text="ShowCustomDialog"  

     />  

    </LinearLayout> 

   

    layoutinflater2.xml

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

    <LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android" 

     android:orientation="horizontal"  

     android:layout_width="fill_parent"  

     android:layout_height="fill_parent"  

     android:padding="10dp"  

     >  

     <ImageView android:id="@+id/image"  

      android:layout_width="wrap_content"  

      android:layout_height="fill_parent"  

      android:layout_marginRight="10dp"  

     />  

     <TextView android:id="@+id/text"  

      android:layout_width="wrap_content"  

      android:layout_height="fill_parent"  

      android:textColor="#FFF"  

     />  

     </LinearLayout> 

 

     public class LayoutInflaterDemo extends Activity implements OnClickListener { 

      

      private Button button;  

      public void onCreate(Bundle savedInstanceState) {  

       super.onCreate(savedInstanceState);  

       setContentView(R.layout.layoutinflater);  

       button = (Button)findViewById(R.id.button);  

       button.setOnClickListener(this); //添加监听器 

      }  

      @Override  

      public void onClick(View v) {          

       showCustomDialog();  

      }       

      public void showCustomDialog(){  

       AlertDialog.Builder builder;  

       AlertDialog alertDialog;  

       Context mContext = LayoutInflaterDemo.this;   

       

       LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(LAYOUT_INFLATER_SERVICE); 

       View layout = inflater.inflate(R.layout.layoutinflater2,null);  

       

       TextView text = (TextView) layout.findViewById(R.id.text);  

       text.setText("Hello, 我的名字叫QQ!");  

       ImageView image = (ImageView) layout.findViewById(R.id.image);  

       image.setImageResource(R.drawable.qq);  

       builder = new AlertDialog.Builder(mContext);  

       builder.setView(layout);  

       alertDialog = builder.create();  

       alertDialog.show();  

      }  

     } 

 

   * LayoutInflater的使用,在实际开发种LayoutInflater这个类还是非常有用的,

   * 它的作用类似于findViewById(),不同点是LayoutInflater是用来找layout下

   * xml布局文件,并且实例化!而findViewById()是找具体xml下的具体widget控

   * 件(如:Button,TextView等)。

   * 例如:

    public class LayoutInflaterActivity extends Activity {

     private EditText et;

     private Button btn;

     @Override

     public void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      // 第一种方法

      LayoutInflater inflater = LayoutInflater.from(this);

      View layout = inflater.inflate(R.layout.main, null);

      // 第二种方法

      // LayoutInflater inflater = getLayoutInflater();

      // View layout = inflater.inflate(R.layout.main, null);

      // 第三种方法

      // LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);

      // View layout = inflater.inflate(R.layout.main, null);

      // 这里是通过事先获得的布局文件来实例化具体控件,并且可以根据情况自定义控件

      et = (EditText) layout.findViewById(R.id.edittext);

      et.setBackgroundColor(Color.YELLOW);

      btn = (Button) layout.findViewById(R.id.btn);

      btn.setBackgroundColor(Color.CYAN);

      // 显示

      setContentView(layout);

     }

    }

   另外补充下,getSystemService是Activity中的方法,根据传入的name来取得对应的服务对象,这些服务名称参数都是Context类中的常量:

   传入的Name 返回的对象 说明

    WINDOW_SERVICE     WindowManager 管理打开的窗口程序

    LAYOUT_INFLATER_SERVICE  LayoutInflater 取得xml里定义的view

    ACTIVITY_SERVICE    ActivityManager 管理应用程序的系统状态

    POWER_SERVICE     PowerManger 电源的服务

    ALARM_SERVICE     AlarmManager 闹钟的服务

    NOTIFICATION_SERVICE   NotificationManager 状态栏的服务

    KEYGUARD_SERVICE    KeyguardManager 键盘锁的服务

    LOCATION_SERVICE    LocationManager 位置的服务,如GPS

    SEARCH_SERVICE     SearchManager 搜索的服务

    VEBRATOR_SERVICE    Vebrator 手机震动的服务

    CONNECTIVITY_SERVICE   Connectivity 网络连接的服务

    WIFI_SERVICE WifiManager  Wi-Fi服务

    TELEPHONY_SERVICE    TeleponyManager 电话服务

   ======================================================================================================================================

 3.4    界面布局

   LinearLayout 线性布局 但一行(列)只能放一个控件

     android:orientation="vertical"//垂直线性布局

     android:orientation="horizontal"//水平线性布局

     android:layout_weight="1"//控件权重,即占屏幕的比例 默认为0

    

   RelativeLayout 相对布局

    其参数有:Width,Height,Below,AlignTop,Toleft,Padding,MarginLeft注意其值都是相对其他元素来说的。

    android:layout_toLeftOf="@id/ok"

    android:layout_alignTop="@id/ok"

    android:layout_below="@id/ok"

    android:layout_marginLeft="10dip"

    android:layout_alignParentRight="true"

   

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

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent">

     <TextView

      android:id="@+id/label"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="请输入:"/>

     <View----------------------------------------------------------------------------View在xml文件中的运用

      android:layout_height="2dip"

      android:background="#FF909090" />

    </RelativeLayout>

 

   TableLayout 表单布局

    TableLayout容器不会显示Row,Column,Cell的边框线。

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

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:orientation="vertical"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     >

     <TableRow>

      <TextView 

       android:id= "@+id/textView1"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:text="Button,TextView,EditView"

      />

      <TextView 

       android:id ="@+id/textView2"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:text="SimpleAdapter"

       android:gravity="right"

      />

     </TableRow>

    </TableLayout>

   

   FrameLayout 里面只可以有一个控件,且此不能设置此控件位置,此控件总是位于左上角

  

   AbsoluteLayout 里面可以放多个控件,可以定义自己控件的x,y

  

   TabWidget 切换卡 通过继承TabActivity来实现。TabHost 是一个用来存放多个Tab标签的容器,要使用TabHost,要通过getTabHost方法来获得TabHost对象,然后通过addTab方法来向

    TabHost中添加Tab.

    main.xml

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

    <TabHost xmlns:android="http://schemas.android.com/apk/res/android"

     android:id="@android:id/tabhost"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent">

     <LinearLayout

      android:orientation="vertical"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent">

      <TabWidget

       android:id="@android:id/tabs"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content" />

      <FrameLayout

       android:id="@android:id/tabcontent"

       android:layout_width="fill_parent"

       android:layout_height="fill_parent">

       <TextView

        android:id="@+id/textview1"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:text="this is a tab" />

       <TextView

        android:id="@+id/textview2"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:text="this is another tab" />

       <TextView

        android:id="@+id/textview3"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:text="this is a third tab" />

      </FrameLayout>

     </LinearLayout>

    </TabHost>

 

    public class Activity01 extends TabActivity{

      //声明TabHost对象

     TabHost mTabHost;

     @Override

     public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main); 

      //取得TabHost对象

      mTabHost = getTabHost();

      /* 为TabHost添加标签*/

      mTabHost.addTab(mTabHost.newTabSpec("tab_test1")//新建一个newTabSpec(newTabSpec)

       .setIndicator("TAB 1",getResources().getDrawable(R.drawable.img1)) //设置其标签和图标(setIndicator)

       .setContent(R.id.textview1));//设置内容(setContent)

      mTabHost.addTab(mTabHost.newTabSpec("tab_test2")

       .setIndicator("TAB 2",getResources().getDrawable(R.drawable.img2))

       .setContent(R.id.textview2));

      mTabHost.addTab(mTabHost.newTabSpec("tab_test3")

       .setIndicator("TAB 3",getResources().getDrawable(R.drawable.img3))

       .setContent(R.id.textview3));

       

      mTabHost.setBackgroundColor(Color.argb(150, 22, 70, 150));//设置TabHost的背景颜色  

      //mTabHost.setBackgroundResource(R.drawable.bg0);//设置TabHost的背景图片资源

    

      mTabHost.setCurrentTab(0); //设置当前显示哪一个标签

         

      mTabHost.setOnTabChangedListener(new OnTabChangeListener(){ //标签切换事件处理,setOnTabChangedListener -------------------------------------------TabWidget监听器

     

       @Override

       public void onTabChanged(String tabId){

        Dialog dialog = new AlertDialog.Builder(Activity01.this)

         .setTitle("提示")

         .setMessage("当前选中:"+tabId+"标签")

         .setPositiveButton("确定",

          new DialogInterface.OnClickListener(){

           public void onClick(DialogInterface dialog, int whichButton){

            dialog.cancel();

           }

          }).create();//创建按钮       

          dialog.show();

       }           

      });

     }

    }

 


  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值