现在的位置: 首页 > 综合 > 正文

Android常用控件总结

2013年08月19日 ⁄ 综合 ⁄ 共 11127字 ⁄ 字号 评论关闭

第一章

 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对象的

抱歉!评论已关闭.