Activity
- 生命週期:
onCreate -> OnStart -> OnResum()-> [Activity is Running] ->onPause() -> onStop() -> onDestory()
當Activity 處於onStop 調用onRestart() 方法 重新進行活動
實例熟悉Activity的調用/**
- 功能: 點擊忘記密碼 激活一個Activity ,跳轉到忘記密碼界面
- 點擊close 返回主界面
- 自定義的PasswordActivity 繼承Android.app.Activty
- 自定義的PasswordActivity 需要在manifiest 目錄下面對Activity進行註冊
- Activity 、Service 之間通信 主要是通過 Intent 進行通信:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout 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"
android:background="@drawable/biaoge"
android:stretchColumns="0,3"
tools:context=".MainActivity">
<!--第一行-->
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="200dp"
>
<TextView />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="賬 號:"
android:gravity="center_horizontal"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="郵箱或者手機號"
/>
<TextView />
</TableRow>
<!--第二行-->
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="20dp"
>
<TextView />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="密 碼:"
android:gravity="center_horizontal"
/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="輸入6-16位數字或字母"
/>
<TextView />
</TableRow>
<!--第三行-->
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注 冊"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FF8247"
android:text="登 錄"/>
<TextView />
</TableRow>
<!--第四行-->
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="20dp"
>
<TextView />
<TextView />
<TextView
android:id="@+id/wang_mima"
android:text="忘記密碼?"
android:textColor="#FF4500"
android:gravity="right"
/>
<TextView />
</TableRow>
</TableLayout>
<?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="match_parent"
android:orientation="vertical"
android:background="@drawable/beijing"
android:padding="5dp"
tools:context="com.example.myapplication.PasswordActivity">
<ImageButton
android:id="@+id/close"
android:layout_width="15dp"
android:layout_height="15dp"
android:src="@drawable/guanbi"
android:background="#0000"
android:layout_marginTop="15dp"
android:scaleType="fitXY"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:layout_marginLeft="10dp"
android:text="你的郵箱或手機號"/>
<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="請輸入郵箱或手機號"/>
<Button
android:layout_width="200dp"
android:layout_height="50dp"
android:background="#FF8247"
android:text="提交"/>
</LinearLayout>
<!--manifest.xml 配置activity -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 自定義Activity 需要在mainifests 配置聲明 -->
<activity android:name=".PasswordActivity"></activity>
</application>
</manifest>
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
/**
* 功能: 點擊忘記密碼 激活一個Activity ,跳轉到忘記密碼界面
* 點擊close 返回主界面
*
* */
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1. 忘記密碼添加一個點擊監聽按鈕
TextView tv = findViewById(R.id.wang_mima);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Android 通過Intent 機制進行Activity/Service 或者應用程序間通信
Intent passwordIntent = new Intent(MainActivity.this, PasswordActivity.class);
startActivity(passwordIntent);
}
});
}
}
package com.example.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
public class PasswordActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_password);
ImageButton imageButton = findViewById(R.id.close);
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 返回主界面
finish();
}
});
}
}
多個Activity 之間通信
Intent 可以進行Activity 之間的通信 但是無法進行數據保存
所以在多個Activity 通信當中藉助Bundle 容器
Bundle 是一個 容器
data -> putXXX() ->Bundle ->putExtras()-> Intent -> startActivty()->Activity
- 將data 通過putXXX 方法放入到Bundle 包裹中
- 通過 Intnet.putExtras() 將Bundle 對象進行攜帶
- startActivity()
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.example.myapplication.AddressActivity">
<ImageView
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/top"/>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/top"
/>
<TextView
android:id="@+id/phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/site"
android:layout_alignParentRight="true"
android:layout_marginRight="30dp"
/>
<TextView
android:id="@+id/site"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/name"
/>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<!-- 導航條圖片-->
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/top"/>
<!-- 地區-->
<EditText
android:id="@+id/et_site1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入所在地區"
android:paddingTop="50dp"/>
<!-- 街道-->
<EditText
android:id="@+id/et_site2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/et_site1"
android:hint="請輸入街道"/>
<!-- 詳細地址-->
<EditText
android:id="@+id/et_site3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/et_site2"
android:hint="請輸入詳細地址"/>
<!--姓名-->
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/et_site3"
android:hint="請輸入收貨人姓名"/>
<!--電話-->
<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/et_name"
android:hint="請輸入收貨人聯繫電話"/>
<!--郵箱-->
<EditText
android:id="@+id/et_email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/et_phone"
android:hint="請輸入郵編"/>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="10dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:background="#FF5000"
android:text="保存"
/>
</RelativeLayout>
package com.example.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class AddressActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_address);
// 類加載器this 自動識別哪個 Intnet
Intent intnet = getIntent();
Bundle bundle = intnet.getExtras();
TextView name = (TextView) findViewById(R.id.name);//獲取顯示姓名的TextView組件
name.setText(bundle.getString("name"));//獲取輸入的姓名並顯示到TextView組件中
TextView phone = (TextView) findViewById(R.id.phone);//獲取顯示手機號碼的TextView組件
phone.setText(bundle.getString("phone"));//獲取輸入的電話號碼並顯示到TextView組件中
TextView site = (TextView) findViewById(R.id.site);//獲取顯示地址的TextView組件
//獲取輸入的地址並顯示到TextView組件中
site.setText(bundle.getString("site1") + bundle.getString("site2") + bundle.get("site3"));
}
}
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/**
* 功能: 收貨地址保存的
*
*
* */
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button saveButton = findViewById(R.id.btn);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 獲取數據保存
String site1 = ((EditText)findViewById(R.id.et_site1)).getText().toString();
String site2 = ((EditText)findViewById(R.id.et_site2)).getText().toString();
String site3 = ((EditText)findViewById(R.id.et_site3)).getText().toString();
String email = ((EditText)findViewById(R.id.et_email)).getText().toString();
String name = ((EditText)findViewById(R.id.et_name)).getText().toString();
String phone = ((EditText)findViewById(R.id.et_phone)).getText().toString();
if (!"".equals(site1) && !"".equals(site2) && !"".equals(site3)&&
!"".equals(name) && !"".equals(phone) &&!"".equals(email) ) {
//將輸入的信息保存到Bundle中,通過Intent傳遞到另一個Activity當中並顯示出來
Intent intent = new Intent(MainActivity.this, AddressActivity.class);
//創建並實例化一個Bundle對象
Bundle bundle = new Bundle();
bundle.putCharSequence("name", name);//保存姓名
bundle.putCharSequence("phone", phone);//保存手機號碼
bundle.putCharSequence("site1", site1);//保存所在地區信息
bundle.putCharSequence("site2", site2);//保存所在街道信息
bundle.putCharSequence("site3", site3);//保存詳細地址信息
intent.putExtras(bundle);//將Bundle對象添加到Intent對象中
startActivity(intent);//啓動Activity
}else {
Toast.makeText(MainActivity.this,"請將收貨地址填寫完整!",Toast.LENGTH_SHORT).show();
}
}
});
}
}
調用另外一個Activity 並有返回結果
同樣也 藉助Bundle + Intnet 不同是不是調用startActivity () 方法是通過調用startActivityForResult() 獲取其返回值
- mainActivity startActivityForResult 方法啓動 帶有標誌參數requestCode
- HeadActivity setResult(responseCode, Intnet) 返回數據
- MainActivity 中重寫onActivityResult 通過對比 requestCode 與responseCode 獲取返回結果
public void startActivityForResult(Intnet intnet, int RequestCode)
請求碼 表示 這個Activity來源
package com.example.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
/**
* 添加一個Adpater 適配器
*/
public class HeadActivity extends Activity {
// 定義並初始化保存頭像id的數組
public int[] imageId = new int[]{R.drawable.touxiang1, R.drawable.touxiang2,
R.drawable.touxiang3, R.drawable.touxiang4, R.drawable.touxiang5
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_head);
// 添加一個網格適配器
GridView gridView = findViewById(R.id.gridView);
BaseAdapter baseAdapter = new BaseAdapter() {
@Override
public int getCount() {
return imageId.length;
}
@Override
public Object getItem(int i) {
return i;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ImageView imageview; //聲明ImageView的對象
if (view == null) {
imageview = new ImageView(HeadActivity.this); //實例化ImageView的對象
/*************設置圖像的寬度和高度******************/
imageview.setAdjustViewBounds(true);
imageview.setMaxWidth(158);
imageview.setMaxHeight(150);
/**************************************************/
imageview.setPadding(5, 5, 5, 5); //設置ImageView的內邊距
} else {
imageview = (ImageView) view;
}
//爲ImageView設置要顯示的圖片
imageview.setImageResource(imageId[i]);
return imageview; //返回ImageView
}
};
gridView.setAdapter(baseAdapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putInt("imageId", imageId[i]);
intent.putExtras(bundle);
// HeadActivity 設置返回結果 與MainActivity startActivityForResult 相同
setResult(0x11, intent);
System.out.println("頭像返回結果");
finish();
}
});
}
}
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
/**
* 功能: 收貨地址保存的
*
*
* */
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button= findViewById(R.id.btn_head);//獲取選擇頭像按鈕
button.setOnClickListener(new View.OnClickListener() { //爲按鈕創建單機事件
@Override
public void onClick(View v) {
//創建Intent對象
Intent intent=new Intent(MainActivity.this,HeadActivity.class);
startActivityForResult(intent, 0x11);//啓動intent對應的Activity
}
});
}
// mainActtivity 中重寫 結果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//判斷是否爲待處理的結果
if(requestCode==0x11 && resultCode==0x11) {
Bundle bundle = data.getExtras();
int imageViewId = bundle.getInt("imageId");
ImageView iv= findViewById(R.id.imageView); //獲取佈局文件中添加的ImageView組件
iv.setImageResource(imageViewId); //顯示選擇的頭像
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.example.myapplication.HeadActivity">
<GridView
android:id="@+id/gridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:horizontalSpacing="3dp"
android:verticalSpacing="3dp"
android:numColumns="4">
</GridView>
</RelativeLayout>
<?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="match_parent"
android:background="@drawable/beijing"
android:orientation="vertical"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/touxiang"/>
<Button
android:id="@+id/btn_head"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:text="選擇頭像"
/>
</LinearLayout>
activity 重用Fragment
fragment :碎片, 設置UI 多個Fragment 嵌入Activity 中,生命週期最長與當前Activity 生命週期一樣。
- Activity 添加Fragment:
直接在 XML添加Fragment
在 main_activity.xml 中水平放置
<fragment
android:id="@+id/fragment"
android:name="com.mingrisoft.WeChat_Fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- 在運行中動態添加Fragment
package com.example.myapplication;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
// 動態加載時候 有事務概念 FragmentTransaction 將Fragment add
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment detailFragment = new Fragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.btn_head, detailFragment);
// 提交事務
ft.commit();
}
}
實例: 通過添加四個不懂Fragment 顯示微信上不同界面:
package com.example.myapplication;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
/**
* 功能: d點擊不同Freagment 顯示不同圖片
*
*
* */
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 獲取四個不同ImageView
ImageView imageView1 = findViewById(R.id.image1);
ImageView imageView2 = findViewById(R.id.image2);
ImageView imageView3 = findViewById(R.id.image3);
ImageView imageView4 = findViewById(R.id.image4);
imageView1.setOnClickListener(L);//爲第一個導航圖片添加單機事件
imageView2.setOnClickListener(L);//爲第二個導航圖片添加單機事件
imageView3.setOnClickListener(L);//爲第三個導航圖片添加單機事件
imageView4.setOnClickListener(L);//爲第四個導航圖片添加單機事件
}
View.OnClickListener L = new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
Fragment f = null;
switch (view.getId()) { //通過獲取點擊的id判斷點擊了哪個張圖片
case R.id.image1:
f = new WeChat_Fragment(); //創建第一個Fragment
break;
case R.id.image2:
f = new Message_Fragment();//創建第二個Fragment
break;
case R.id.image3:
f = new Find_Fragment();//創建第三個Fragment
break;
case R.id.image4:
f = new Me_Fragment();//創建第四個Fragment
break;
default:
break;
}
ft.replace(R.id.fragment, f);
ft.commit();
}
};
}
package com.example.myapplication;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
/**
* Created by Administrator on 2016/2/18.
*/
public class Find_Fragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.find_fragment,null);
return view;
}
}
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<!-- 添加爲 WeChat Fragment -->
<fragment
android:id="@+id/fragment"
android:name="com.example.myapplication.WeChat_Fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:orientation="horizontal">
<ImageView
android:id="@+id/image1"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:src="@drawable/bottom_1"
/>
<ImageView
android:id="@+id/image2"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:src="@drawable/bottom_2"
/>
<ImageView
android:id="@+id/image3"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:src="@drawable/bottom_3"
/>
<ImageView
android:id="@+id/image4"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:src="@drawable/bottom_4"
/>
</LinearLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/wo"
android:scaleType="fitXY"/>
</RelativeLayout>