android开发中重要组件Activity详细学习教程

Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。它间接继承自android.content.Context,因此,有些时候都直接把Activity实例当做Context的实例来使用。

如前面所提到的要在应用程序中使用Activity,必须在Android Manifest.xml中配置它。

新建一个Android工程,新建过程中勾选create activity,让系统自动帮我们创建一个Activity并在Android Manifest.xml中配置它。

AndroidManifest.xml代码如下:

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.csc.activity"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="14" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".FirstActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

配置中,Activity节点比较重要的属性有:

android:name属性:指明该Activity节点对应的Activity定义所在的类名,这里默认简写为.FisrtActivity,完整的类名需要与Manifest节点的package属性进行拼接,也可以直接写完整的类名,这里即为cn.csc.activity.FirstActivity。注意,name属性是必须配置的,否则报错,毕竟不配置name属性本身就没有任何意义了。

android:label属性:指明该Activity的标题栏显示的内容。

此外,比较重要的还有一个:

android:launchMode属性:指明该Activity的加载模式。取值可以是standard、singleTop、singleTask和singleInstance。这个属性在提到Activity生命周期时会用到。

回到FirstActivity.java的代码来看:

public class FirstActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
    }
}

Activity中常用的方法:

void  onCreate(Bundle savedInstanceState)  :这个方法在该Activity被创建时回调,进行相关的初始化工作。如,我们最常做的setContentView();设置一个UI界面。

void  setContentView(int layoutResID)  

void  setContentView(View view)  :这两个方法用于给Activity设置UI界面,只是传入的参数类型不同,一个是传入一个layout资源id,一个是直接在代码中编写UI界面。

View  findViewById(int id)  :根据控件的id找到该id,返回值是一个View实例,通常需要进行向下转型到具体类型,如Button、TextView等,以便对控件进行操作,如设置控件属性值,进行事件绑定等。

在first_layout.xml中添加一个按钮,需要设置按钮的id属性,在FirstActivity中的onCreate()方法中根据id获取该按钮,然后设置它的单击响应,弹出一个Toast信息。

代码如下:

first_layout.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btnText"
        />
</RelativeLayout>

FirstActivity.java:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button btn =  (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
                      // TODO Auto-generated method stub
                      Toast.makeText(FirstActivity.this, "I'm clicked", Toast.LENGTH_SHORT).show();
                 }
           });
}

void  startActivity(Intent intent)  :用于启动一个新的Activity,参数intent中指定了要启动Activity的相关信息。

void  finish()  :用于结束,并销毁当前Activity。

新建一个Activity,名为SecondActivity;新建一个layout文件,名为second_layout.xml

修改first_layout中按钮的点击事件,使它启动SecondActivity。

代码如下:

second_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <Button android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/close"/>
</LinearLayout>

SecondActivity.java:

protected void onCreate(Bundle savedInstanceState) {
       // TODO Auto-generated method stub
       super.onCreate(savedInstanceState);
       setContentView(R.layout.second_layout);
       Button btn2 =  (Button) findViewById(R.id.btn2);
       btn2.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                  // TODO Auto-generated method stub
                  finish();
             }
       });
  }

FirstActivity.java:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button btn =  (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
                      // TODO Auto-generated method stub
//                    Toast.makeText(FirstActivity.this, "I'm clicked", Toast.LENGTH_SHORT).show();
                      Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                            startActivity(intent);
                 }
           });
}

注意:使用SecondActivity一定要在Manifest.xml中配置

<activity android:name=".SecondActivity" android:label="@string/second">

</activity>

否则会出现如下错误:

点击FirstActivity中的按钮,会启动SecondActivity,点击SecondActivity中的按钮会销毁SecondActivity,然后又回到FirstActivity中。跟点击模拟器上的返回键效果一样。

 

点击I am a button

 

点击Close或者返回键:

关于Intent的使用,将在之后详细说明。

void  startActivityForResult(Intent intent, int requestCode)  :用于启动一个新的Activity,并期望在这个新的Activity结束时返回数据。

void  onActivityResult(int requestCode, int resultCode, Intent data)  :用于接收处理启动的新的Activity结束时返回的数据。

这两个函数在Intent在Android之间传递数据时会用到。

Intent  getIntent()  :获取启动该Activity的意图实例,该方法可以实现获取该Activity的启动者所要传递给自己的存放在Intent中的数据。

关于管理Activity的任务栈:

Activity中有一个int  getTaskId()方法 :用于获取当前Activity所处的栈的id。

修改FirstActivity中的onCreate():

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button btn =  (Button) findViewById(R.id.btn);
        Log.i("TaskId","First:"+getTaskId());
        btn.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
                      // TODO Auto-generated method stub
//                    Toast.makeText(FirstActivity.this, "I'm clicked", Toast.LENGTH_SHORT).show();
                      Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                      startActivity(intent);
                 }
           });
}

及SecondActivity中的onCreate():

protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Button btn2 =  (Button) findViewById(R.id.btn2);
        Log.i("TaskId","Second:"+getTaskId());
        btn2.setOnClickListener(new OnClickListener() {
            
             @Override
             public void onClick(View v) {
                   // TODO Auto-generated method stub
                   finish();
             }
        });
  }

注意:Log.i("TaskId","First:"+getTaskId());用于在LogCat中输出程序运行信息,第一个为Tag参数,第二个要输出的字符串信息。

打开LogCat界面:window ----> show view ----> other ---->即可找到LogCat。

由于显示的运行信息比较多,可以添加一个信息过滤器,只显示我们所关心的信息。

点击绿色的加号

 

由于我们在之前的Log.i()中设定了Tag参数为TaskId,这时选择by Log Tag,然后填入我们所设置的TaskId即可,随便给过滤器取个名字,然后OK。

启动应用程序,若发现仍有很多运行信息:

 

此时,单击下TaskId会发现只剩下一条了

 

此时运行的是FirstActivity,显示的是FirstActivity所在的任务栈的id为15。然后点击程序中的按钮,启动SecondActivity,发现又多出一条信息:

发现SecondActivity所在的任务栈id同样为15。

一个android应用中,不可能只有一个Activity,如上面启动了两个Activity。Android中使用任务栈来管理多个Activity。

当一个Activity被创建启动时,就会把它放入一个任务栈的栈顶。当该Activity结束被销毁时,就会从所在任务栈弹出,其下的Activity变为栈顶,切换到活动状态。当有新的Activity被启动时,它会入栈称为新的栈顶,之前活动的Activity被强制切换到暂停或者停止状态。

任意时刻,只有栈顶的Activity处于活动状态,可以与用户进行交互。栈中其他Activity若是仍然可见或部分可见,即没有被当前活动Activity完全遮盖时,则处于暂停状态。若完全不可见,则处于停止状态。

一般来说,一个android应用中所有的Activity都会被放到同一个任务栈中进行统一管理,但是也有例外,如上面提到的在Manifest.xml中配置launchMode时,配置不同的值就会有所差别。

关于Activity的状态:

任意时刻,一个Activity都处于下面四个状态之一:

运行状态:位于任务栈的栈顶,此时能够与用户进行交互。

暂停状态:不再处于任务栈的栈顶,不能与用户交互,但是仍然有部分可见。

停止状态:不再处于任务栈的栈顶,不能与用户交互,而且完全不可见。

销毁状态:已从任务栈中弹出。

当系统内存不足时,会优先回收处于销毁状态的Activity所占用的资源;仍然不足时,会回收处于停止状态的Activity所占用的资源;仍然不足时,会回收处于暂停状态的Activity的资源;最不愿意回收的是运行状态的Activity资源。

关于Activity的加载模式与任务栈的关联:

前面提到android:launchMode属性:指明该Activity的启动模式。取值可以是standard、singleTop、singleTask和singleInstance。

standard模式:是默认的启动模式,若没有明确指定启动模式,则为standard模式。如上面的FirstActivity和SecondActivity都没有设置launchMode属性,即为standard模式。

在该模式下,每当新启动一个Activity时,都会为之创建一个新的实例,然后放入栈顶,而不在乎任务栈中是否已然存在该Activity的实例。

修改FirstActivity代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button btn =  (Button) findViewById(R.id.btn);
        Log.i("TaskId","First:"+this+" "+getTaskId());
        btn.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
                      // TODO Auto-generated method stub
//                    Toast.makeText(FirstActivity.this, "I'm clicked", Toast.LENGTH_SHORT).show();
                      Intent intent = new Intent(FirstActivity.this, FirstActivity.class);
                      startActivity(intent);
                 }
           });
    }

Log.i("TaskId","First:"+this+" "+getTaskId());此处,加上this,打印出当前实例引用this的值。

按钮的点击响应改为启动FirstActivity自身。

运行信息:

 

发现每次this的值都不同,可见每次都新建了一个FirstActivity实例,即便当前FirstActivity实例已然位于任务栈中,且位于任务栈的栈顶。

singleTop模式:standard模式很多时候明显不太合理,当前Activity已然有实例位于任务栈的栈顶,直接使用不就得了,干嘛非要再创建一个实例浪费资源呢。singleTop模式就是当要启动的Activity已然有实例位于任务栈的栈顶就直接使用当前栈顶,而不重新创建实例。

修改Manifest.xml:

<activity
            android:name=".FirstActivity"
            android:label="@string/first"
            android:launchMode="singleTop" >

修改FirstActivity代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button btn =  (Button) findViewById(R.id.btn);
        Log.i("TaskId","Create:"+this+" "+getTaskId());
        btn.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
                     
                      Intent intent = new Intent(FirstActivity.this, FirstActivity.class);
                      Log.i("TaskId","Click:"+FirstActivity.this+" "+getTaskId());
                      startActivity(intent);
                 }
           });
}

Log.i("TaskId","Create:"+this+" "+getTaskId());表示是onCreate()中调用

在button的onclick中Log.i("TaskId","Click:"+FirstActivity.this+" "+getTaskId());表明是点击按钮调用。

运行信息:

 

发现只有一个Create,即onCreate()方法只调用了一次,只创建了一个FirstActivity实例。

若FirstActivity实例在任务栈中,但是不是在栈顶,又会如何呢?

修改代码,FirstActivity中启动SecondActivity,而SecondActivity又启动FirstActivity,两者均配置为singleTop。

修改FirstActivity代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button btn =  (Button) findViewById(R.id.btn);
        Log.i("TaskId","Create First:"+this+" "+getTaskId());
        btn.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
                     
                      Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                      startActivity(intent);
                 }
           });
}

修改SecondActivity代码:

protected void onCreate(Bundle savedInstanceState) {
           // TODO Auto-generated method stub
           super.onCreate(savedInstanceState);
           setContentView(R.layout.second_layout);
           Button btn2 =  (Button) findViewById(R.id.btn2);
           Log.i("TaskId","Create Second:"+this + " "+getTaskId());
           btn2.setOnClickListener(new OnClickListener() {
                
                 @Override
                 public void onClick(View v) {
                      // TODO Auto-generated method stub
                      Intent intent = new Intent(SecondActivity.this, FirstActivity.class);
                      startActivity(intent);
                 }
           });
      }

运行信息:

 

发现每次都新建了一个实例,即使当前Activity在任务栈中已然存在,但由于并没与处于栈顶,就要再次创建新的实例。

singleTask模式:可能会觉得singleTop模式还是浪费资源,明明栈中已然存在实例,只因为它不在栈顶便要重新创建。若是想重用不在栈顶的Activity实例,则需要使用singleTask模式,该模式下,新启动一个Activity时,检查当前任务栈中是否存在实例,若存在,但是不在栈顶也没关系,系统会把所有在这个实例之上的Activity实例统统出栈,这样这个实例就处于栈顶,然后就可以直接重用了。

修改Manifest.xml将两个Activity的launchMode都改为singleTask,源代码不需要改动,此时观察运行信息:

 

启动FirstActivity时,输出一条信息,点击FirstActivity中的按钮,由于SecondActivity在栈中不存在,创建了一个实例,然后点击SecondActivity中的按钮,发现FirstActivity实例已然存在,但是栈顶是SecondActiviy,则会将SecondActivity实例出栈,直接重用已存在的FirstActivity实例,所以,此时没有回调onCreate(),故而没有输出信息。

singleInstance模式:用于共享Activity时使用。设置为该模式的Activity不会与当前应用中的其他Activity公用一个任务栈,而是出于自己单独的任务栈中。而几个公用这个Actiivty的应用,共享这个单独的任务栈,就实现了该Activity实例的共享。不然的话,每个应用都有自己的任务栈,启动的Activity肯定在自己的任务栈中管理,根本做不到Activity实例的共享。

修改程序,添加一个ThirdActivity,程序运行的效果FirstActivity为入口,在其中点击按钮可以启动SecondActivity,SecondActivity的launchMode设置为singleInstance,点击SecondActivity中的按钮,可以启动ThirdActivity。ThirdActivity中的按钮可以启动SecondActivity。

FirstActivity和ThirdActivity的launchMode均设置为singleTask。

运行信息:

 

FirstActivity和ThirdActivity都在同一个栈中,id为28

而SecondActivity在id为29的栈中。

注意,此时,点击ThirdActivity中的按钮启动SecondActivity时,不会输出任何信息,因为直接重用了id为29的任务栈中的SecondActivity实例。若在ThirdActivity时,按下模拟器的返回按钮,销毁ThirdActivity,则会直接回到FirstActivity中,因为它俩是处在同一个栈中的。

关于Activity的生命周期:

下面是Activity整个生命周期中,状态发生变化时所回调的方法,它们对应着Activity完整的生命过程。

void  onCreate(Bundle savedInstanceState):Activity被创建时回调

void  onStart()  :在onCreate()或者onRestart()之后被调用,即Activity第一次创建或者从不可见变为可见状态时调用。

void  onResume()  :恢复到活动状态时回到,在onStart()之后一定会调用该方法。之后该活动就处于活动状态了,处于任务栈的栈顶。

void  onPause()  :失去焦点,但是仍然部分可见时回调。

void  onStop()  :Activity变为完全不可见时回调

void  onRestart()  :Activity重新启动时回调

void  onDestroy()  :Activity被销毁前回调

上面的7个方法,除了onRestart()之外,在生命周期的图中都是成对出现的。分为三对,也就出现了三种生存期。

从onCreate()到onDestroy(),一个Activity实例经历了创建到销毁的所有过程,被称之为完整生存期。

从onStart()到onStop(),一个Activity实例从可见状态变为不可见状态,被称之为可见生存期。注意,可见并不一定处于栈顶,因而并一定能与用户交互。

从onResume()到onPause(),一个Activity实例经历了从活动状态到暂停状态,这两个方法之间的过程,该Activity实例都处于活动状态,被称之为前台生存期,或者活动状态生存期。

完整生命周期程序演示,参考《第一行代码》

程序有三个Activity:MainActivity是入口,放置两个按钮,分别用于启动另外两个Activity,实现7个生命周期回调方法,分别输出一条运行信息;NormalActivity就是一个普通的Activity;DialogActivity在Manifest.xml中配置了theme属性,使其成为一个对话框样式的Activity,<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog"></activity>。

具体代码:

main_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <Button
        android:id="@+id/normal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/start_normal_activity"/>
    <Button
        android:id="@+id/dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/start_dialog_activity"/>
</LinearLayout>

MainActivity.java:

public class MainActivity extends ActionBarActivity implements OnClickListener {
      @Override
      public void onClick(View view) {
           // TODO Auto-generated method stub
           switch (view.getId()) {
           case R.id.normal:
                 Intent intent1 = new Intent(this, NormalActivity.class);
                 startActivity(intent1);
                 break;
           case R.id.dialog:
                 Intent intent2 = new Intent(this, DialogActivity.class);
                 startActivity(intent2);
           default:
                 break;
           }
      }
      @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        Log.i("LIFECYCLE","onCreate");
        Button btnNormal = (Button) findViewById(R.id.normal);
        Button btnDialog = (Button) findViewById(R.id.dialog);
        btnNormal.setOnClickListener(this);
        btnDialog.setOnClickListener(this);
    }
      @Override
      protected void onStop() {
           // TODO Auto-generated method stub
           super.onStop();
           Log.i("LIFECYCLE","onStop");
      }
      @Override
      protected void onDestroy() {
           // TODO Auto-generated method stub
           super.onDestroy();
           Log.i("LIFECYCLE","onDestroy");
      }
      @Override
      protected void onPause() {
           // TODO Auto-generated method stub
           super.onPause();
           Log.i("LIFECYCLE","onPause");
      }
      @Override
      protected void onStart() {
           // TODO Auto-generated method stub
           super.onStart();
           Log.i("LIFECYCLE","onStart");
      }
      @Override
      protected void onRestart() {
           // TODO Auto-generated method stub
           super.onRestart();
           Log.i("LIFECYCLE","onRestart");
      }
      @Override
      protected void onResume() {
           // TODO Auto-generated method stub
           super.onResume();
           Log.i("LIFECYCLE","onResume");
      }
}

运行信息:

首先启动该应用程序,依次输出:

 

可见,正如生命周期图中所示,依次调用了onCreate()、onStart()、onResume()。

然后点击第一个按钮,启动那个普通的Activity,依次输出:

 

可见,当NormalActivity启动时,MainActivity调用onPause()进入暂停状态,由于NormalActivity启动后,MainActivity被NormalActivity完全遮住时,又要调用onStop()进入停止状态。

然后,点击模拟器的返回按钮,依次输出:

 

可见,由于按下返回键后,NormalActivity被销毁,MainActivity由不可见状态变为可见状态,则依次调用onRestart()、onStart(),又由于MainActivity当前处于任务栈栈顶,所以又调用onResume()进入活动状态。

然后,点击第二个按钮,启动DialogActivity,依次输出:

 

由于MainActivity仍然有部分可见,只是当前不再处于任务栈栈顶而已,所以调用了onPause()进入暂停状态。

然后,按下模拟器上的返回按钮,依次输出:

 

DialogActivity被销毁,MainActivity重新回到栈顶,调用onResume()进入活动状态。

然后,再按下模拟器上的返回按钮,依次输出:

 

MainActivity要被销毁,从活动状态到销毁状态,依次调用了onPause()、onStop()和onDestroy()。

以上就是一个完整的Activity生命周期演示。

此外,由于停止状态和暂停状态的Activity有可能被系统回收资源,当一个Activity从暂停或者停止状态重新回到活动状态时,由于可能已经被回收依次,之前的操作、数据等,如填写了好大一张表单,全都要重新开始,用户体验极差。这时,就要用到涉及Activity实例状态保存的回调函数:

onSaveInstanceState(Bundle bundle):用于在被系统回收之前,将需要保存的一些Activity实例状态信息,重要数据等保存到bundle对象中。当该Activity实例下次被创建时,调用onCreate(Bundle bundle)方法时,这个bundle对象会传递给onCreate()方法,则可以在onCreate方法中,获取到上次保存的数据,进行相应的初始化,恢复工作。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索button
, 实例
, this
, 属性
, 模式
活动
,以便于您获取更多的相关知识。

时间: 2024-10-03 16:20:07

android开发中重要组件Activity详细学习教程的相关文章

Android开发中重要组件activity 生命周期以及启动模式分析

Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务. Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件. 在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应.Activity之间通过Intent进行通信. Activity生命周期 安卓活动由一个返回栈管理 安卓活动有四个状态 1.运行状态 当一个活动位

Android开发中Service应用于广播接收者教程

什么是服务:长期后台运行的没有界面的组件, android是应用场景:天气预报:后台的连接服务器的逻辑,每隔一段时间获取最新的天气信息股票显示:后台的连接服务器的逻辑,每隔一段时间获取最新的股票信息mp3播放器: 后台长期的播放音乐. new Thread(){}.start(); 子线程没有界面,也是长期后台运行的. android系统进程管理是按照一定的规则的: 1.应用程序一旦被打开 通常情况下关闭(清空任务栈)后进程不会停止.方面下一次快速启动. 带来内存不足的问题. 2.Android

Android开发中RecyclerView控件使用实例教程

Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下RecyclerView的特点: 1.支持不同方向,不同排版模式,实现多种展现数据的形式,涵盖了ListView,GridView,瀑布流等数据表现的形式 2.内部实现了回收机制,无需我们考虑View的复用情况 3.取消了onItemClick等点击事件,需要自己手动去写 -------------------

Android应用开发中使用Fragment的入门学习教程_Android

  Fragment是Android honeycomb 3.0开始新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragment用来描述一些行为或一部分用户界面在一个Activity中,你可以合并多个fragment在一个单独的activity中建立多个UI面板,同时重用fragment在多个activity中.你可以认为fragment作为一个activity中的一节模块 ,fragment有自己的生命周期,接收

Android App开发中ViewPager组件的入门使用教程

首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能.下篇再仔细讲讲为什么要这么写. 效果图: 实现了三个view间的相互滑动 第一个VIEW向第二个VIEW滑动: 第二个VIEW向第三个VIEW滑动: 一.新建项目,引入ViewPager控件 ViewPager.它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换. 1.在主布局文件里加入 <RelativeLayout xmlns:android="http://schem

Android应用开发中使用Fragment的入门学习教程

Fragment是Android honeycomb 3.0开始新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragment用来描述一些行为或一部分用户界面在一个Activity中,你可以合并多个fragment在一个单独的activity中建立多个UI面板,同时重用fragment在多个activity中.你可以认为fragment作为一个activity中的一节模块 ,fragment有自己的生命周期,接收自己

Android开发中RecyclerView组件使用的一些进阶技讲解_Android

RecyclerView的优势: 它自带ViewHolder来实现View的复用机制,再也不用ListView那样在getView()里自己写了 使用LayoutManager可以实现ListView,GridView以及流式布局的列表效果 通过setItemAnimator(ItemAnimator animator)可以实现增删动画(懒的话,可以使用默认的ItemAnimator对象,效果也不错) 控制item的间隔,可以使用addItemDecoration(ItemDecoration

Android开发中RecyclerView组件使用的一些进阶技讲解

RecyclerView的优势: 它自带ViewHolder来实现View的复用机制,再也不用ListView那样在getView()里自己写了 使用LayoutManager可以实现ListView,GridView以及流式布局的列表效果 通过setItemAnimator(ItemAnimator animator)可以实现增删动画(懒的话,可以使用默认的ItemAnimator对象,效果也不错) 控制item的间隔,可以使用addItemDecoration(ItemDecoration

Android开发中Activity创建跳转及传值的方法_Android

在Android系统的江湖中有四大组件:活动(Activity), 服务(Service), 广播接收器(Broadcast Reciver)和内容提供者(Content Provider). 今天所介绍的就是Android开发中的四大组件之一:Activity,其他那三大组件以后再进行介绍.说道Android中的Activity,如果你做过iOS开发的话,Activity类似于iOS中的ViewController(视图控制器).在应用中能看到的东西都是放在活动中的.活动是安卓开发比较重要的东