繼昨天講完了Intent(換頁),今天主要要講bundle(傳值)的部分,接續昨天設計完的程式再來加以設計。
昨天講的intent用一個比喻來說的話,比較像是交通工具,就像是我今天從A地搭飛機至B地,飛機是交通工具,也可以把她想成intent,而準備的行李,就可以把他想成bundle,也就是bundle這個應用,intent是必要的,那麼就開始設計bundle的部分。
那麼今天就來設計一個簡單的註冊、登入,首先先宣告三個資料:使用者名稱、帳號、密碼,首先先看到布局的圖。
註冊頁-程式碼:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ConstraintLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:layout_width="159dp"
android:layout_height="48dp"
android:background="@color/purple_200"
android:text="註冊"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.543" />
<EditText
android:id="@+id/editTextTextPersonName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="152dp"
android:layout_marginTop="116dp"
android:ems="10"
android:inputType="textPersonName"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editTextTextEmailAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="152dp"
android:layout_marginTop="196dp"
android:ems="10"
android:inputType="textEmailAddress"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editTextTextPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="152dp"
android:layout_marginTop="272dp"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="134dp"
android:layout_height="39dp"
android:layout_marginStart="16dp"
android:layout_marginTop="120dp"
android:gravity="center"
android:text="使用者名稱:"
android:textSize="18dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView3"
android:layout_width="112dp"
android:layout_height="39dp"
android:layout_marginStart="40dp"
android:layout_marginTop="200dp"
android:gravity="center"
android:text="帳號:"
android:textSize="20dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView4"
android:layout_width="112dp"
android:layout_height="39dp"
android:layout_marginStart="40dp"
android:layout_marginTop="276dp"
android:gravity="center"
android:text="密碼:"
android:textSize="20dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
登入頁-程式碼:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/editTextTextEmailAddress2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="108dp"
android:layout_marginTop="140dp"
android:ems="10"
android:inputType="textEmailAddress"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editTextTextPassword2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="108dp"
android:layout_marginTop="244dp"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="68dp"
android:layout_height="25dp"
android:layout_marginTop="148dp"
android:layout_marginEnd="4dp"
android:gravity="center"
android:text="帳號:"
android:textSize="20dp"
app:layout_constraintEnd_toStartOf="@+id/editTextTextEmailAddress2"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView7"
android:layout_width="68dp"
android:layout_height="25dp"
android:layout_marginTop="252dp"
android:layout_marginEnd="4dp"
android:gravity="center"
android:text="密碼:"
android:textSize="20dp"
app:layout_constraintEnd_toStartOf="@+id/editTextTextPassword2"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="139dp"
android:layout_height="48dp"
android:layout_marginStart="136dp"
android:layout_marginTop="340dp"
android:text="登入"
android:textSize="20dp"
android:background="@color/purple_200"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText u = findViewById(R.id.editTextTextPersonName);
EditText a = findViewById(R.id.editTextTextEmailAddress);
EditText p = findViewById(R.id.editTextTextPassword);
Button B = findViewById(R.id.button);
B.setOnClickListener(new View.OnClickListener() { //因為我的Button名稱宣告是B,所以是監聽按鈕B
@Override
public void onClick(View v) {
String username=u.getText().toString();//取得資料(getText)轉為string型態
String account=a.getText().toString();
String password=p.getText().toString();
//如果有其中一筆資料去除空格(trim)==""(空值)成立的話,結果會反向(false)為不進入if,若都為false則為有資料=true
if(!(("".equals(username.trim())) || ("".equals(account.trim())) || ("".equals(password.trim())))){
Toast.makeText(MainActivity.this, "註冊成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent();//新增交通工具
intent.setClass(MainActivity.this, Activity2.class);//目的地
/*************************************bundle片段*******************************************/
Bundle bundle = new Bundle();//新增行李箱(存放資料)
bundle.putString("username_key",username);//行李的東西(資料,取值用key)
bundle.putString("account_key",account);
bundle.putString("password_key",password);
intent.putExtras(bundle); /******************************************************************************************/
startActivity(intent);
}
else
Toast.makeText(MainActivity.this, "註冊失敗", Toast.LENGTH_SHORT).show();
}
});
}
}
這是MainActivity的程式碼,可以看到bundle傳入三個key值的資料,當然另外還有putInt之類的型態可以傳入,最後利用putExtras這個方法把所有傳入的東西包裝起來,在startActivity(intent)就會傳過去了,另外我有寫了如果其中有資料未填入的話,則會toast出註冊失敗且不跳頁。
public class Activity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.page2);
Button B=findViewById(R.id.button2);//登入按鈕
EditText a=findViewById(R.id.editTextTextEmailAddress2);
EditText p=findViewById(R.id.editTextTextPassword2);
/***************************bundle取值*******************************/
Bundle bundle = getIntent().getExtras();//取得前一個activity放進來的資料
String account_register=bundle.getString("account_key");//用你剛剛設的key去取資料
String password_register=bundle.getString("password_key");
String username_register=bundle.getString("username_key");//使用者名稱
/*******************************************************************/
B.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String account_login=a.getText().toString();//此activity登入的資料
String password_login=p.getText().toString();
if(account_login.equals(account_register) && password_login.equals(password_register))//比對資料
{
Toast.makeText(Activity2.this,username_register+"登入成功",Toast.LENGTH_SHORT).show();
}
else
Toast.makeText(Activity2.this,"登入失敗",Toast.LENGTH_SHORT).show();
}
});
}
}
可以透過getIntent().getExtras()來取得所有傳入的資料,再透過getString(key)來取key對應輸入的資料。
另外其他就是一些比對資料相同的動作。