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();


       }           


      });


     }


    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值