- Activity:界面交互
- Intent: 数据传递
###一个主界面
<activity android:name=".MyActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
|
其中"android.intent.action.MAIN"
表示主界面,apk启动时大多从这里开始启动.
"android.intent.category.LAUNCHER"
展示在系统的LAUNCHER中,没有这个就没有启动图标。
###创建一个菜单
首先创建一个菜单的布局文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/add_item" android:title="Add"/> <item android:id="@+id/remove_item" android:title="Remove"/> <item android:id="@+id/exit_item" android:title="Exit"/> </menu>
|
Activity中实现
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main,menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.add_item: Toast.makeText(MyActivity.this,"add_item",Toast.LENGTH_SHORT).show(); break; case R.id.remove_item: Toast.makeText(MyActivity.this,"remove_item",Toast.LENGTH_SHORT).show(); break; case R.id.exit_item: finish(); break; default: break; } return true; }
|
###界面间交互
用Intent进行参数传递
首先是 AndroidManifest.xml
文件中如下声明
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="com.cn.yllen.myapplication.ACTION_START" /> <category android:name="com.cn.yllen.myapplication.MY_CATECORY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
|
####分别有显式
、隐式
两种intent方式启动activity
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.cn.yllen.myapplication.ACTION_START"); intent.addCategory("com.cn.yllen.myapplication.MY_CATECORY"); startActivity(intent); } });
|
####打开网页
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://ring3.xyz")); Toast.makeText(SecondActivity.this,Uri.parse("http://ring3.xyz").toString(),Toast.LENGTH_SHORT).show(); startActivity(intent);
|
####传递参数 & 接收参数
String data = "你好世界"; Intent intent = new Intent(SecondActivity.this,ThirdActivity.class); intent.putExtra("extra_data",data); startActivity(intent); Intent intent = getIntent(); String data = intent.getStringExtra("extra_data"); Log.d(TAG, "onCreate: " + data);
|
####启动activity并获取返回值
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class); startActivityForResult(intent,1); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode == RESULT_OK) { String returnedData = data.getStringExtra("ret_data"); Log.d(TAG, "onActivityResult: " + returnedData); } break; default: break; } } Button button = (Button) findViewById(R.id.button_3); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("ret_data","这是返回值哦~"); setResult(RESULT_OK,intent); finish(); } });
|
activity生存期


启动模式
声明方式
<activity ... android:launchMode="xx"> ... </activity>
|
standard
:每次都生成一个新的activity放在栈顶
startActivity(xx.this,xx.class); startActivity(xx.this,xx.class); startActivity(xx.this,xx.class);
|
singleTop
:仅当不在栈顶时生成
startActivity(xx.this,xx.class); startActivity(xx.this,xx.class); startActivity(xx.this,xx.class);
|
singleTask
:全栈唯一
singleInstance
:多栈
自定布局
首先自己完成一个布局类的子类
package com.cn.yllen.myapplication; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; public class TitleLayout extends LinearLayout { public TitleLayout(final Context context , AttributeSet attrs) { super(context,attrs); LayoutInflater.from(context).inflate(R.layout.layout_title,this); Button button1 = (Button) findViewById(R.id.title_back); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context,"back",Toast.LENGTH_SHORT).show(); } }); } }
|
对应的xml布局文件layout_title.xml
实现如下
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/title_bg"> <Button android:id="@+id/title_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="3dp" android:background="@drawable/back_bg" android:text="Back" android:textColor="#fff" /> <TextView android:id="@+id/title_text" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" android:gravity="center" android:text="Title text" android:textColor="#fff" android:textSize="24sp" android:background="@drawable/title_bg" /> <Button android:id="@+id/button_3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="3dp" android:background="@drawable/edit_bg" android:textColor="#fff" android:text="确定3" /> </LinearLayout>
|
将上面布局文件引入其他布局中
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.cn.yllen.myapplication.TitleLayout android:layout_width="match_parent" android:layout_height="wrap_content"> </com.cn.yllen.myapplication.TitleLayout> </LinearLayout>
|
效果图如下:
