Android套件

时间:2020-02-23 14:28:47  来源:igfitidea点击:

在本教程中,我们将讨论有关Android bundle以便在活动之间传递数据的问题。

Android套件

Android Bundle用于在活动之间传递数据。
将要传递的值映射到String键,以后在下一个活动中将其用于检索值。

以下是传入/传出捆绑包的主要类型。

  • putInt(String key, int value), getInt(String key, int value)
  • putIntArray(String key, int[] value), getStringArray(String key, int[] value)
  • putIntegerArrayList(String key, ArrayList value), getIntegerArrayList(String key, ArrayList value value)
  • putString(String key, String value), getString(String key, String value)
  • putStringArray(String key, String[] value), getStringArray(String key, String[] value)
  • putStringArrayList(String key, ArrayList value), getStringArrayList(String key, ArrayList value value)
  • putLong(String key, long value), getLong(String key, long value)
  • putLongArray(String key, long[] value), getLongArray(String key, long[] value)
  • putBoolean(String key, boolean value), getBoolean(String key, boolean value)
  • putBooleanArray(String key, boolean[] value), getBooleanArray(String key, boolean[] value)
  • putChar(String key, char value), getChar(String key, char value)
  • putCharArray(String key, char[] value), getBooleanArray(String key, char[] value)
  • putCharSequence(String key, CharSequence value), getCharSequence(String key, CharSequence value)
  • putCharSequenceArray(String key, CharSequence[] value), getCharSequenceArray(String key, CharSequence[] value)
  • putCharSequenceArrayList(String key, ArrayList value), getCharSequenceArrayList(String key, ArrayList value value)

使用Android套件

捆绑包通过以下方式传递。

Intent intent = new Intent(this,SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("key_1", "MainActivity greeted you with a HI");
bundle.putBoolean("key_2", true);
intent.putExtras(bundle);
startActivity(intent);

来自Bundle的数据按以下方式在SecondActivity.java中检索。

Bundle bundle = getIntent().getExtras();
String title = bundle.getString("key_1");
boolean b = bundle.getBoolean("key_2");

如果键没有映射到任何值,则可能导致NullPointerException。
因此,建议为Bundle以及检索到的值添加空检查。

另外,如果映射的键没有任何值,我们也可以设置默认值。

Bundle bundle = getIntent().getExtras();
String title = bundle.getString("key_1", "Default");
boolean b = bundle.getBoolean("key_2", false);

为了从包中删除一个值,通过带有相关键的remove()方法,如下所示。

bundle.remove("key_2");

要从Bundle中删除所有数据,请在Bundle实例上调用方法clear()。

Android捆绑示例代码

下面给出了" activity_main.xml"布局的代码。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
  xmlns:app="https://schemas.android.com/apk/res-auto"
  xmlns:tools="https://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.theitroad.bundles.MainActivity">

  <Button
      android:id="@+id/btnPassBundles"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="PASS BUNDLES"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent" 

  <Button
      android:id="@+id/btnNoPassBundle"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="PASS NO BUNDLE"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      android:layout_marginTop="8dp"
      app:layout_constraintTop_toBottomOf="@+id/btnPassBundles" 

</android.support.constraint.ConstraintLayout>

第一个按钮会将带有数据的捆绑包传递到SecondActivity.java中,而第二个按钮会将空的捆绑包传递给

下面给出了" activity_second.xml"布局的代码。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
  xmlns:app="https://schemas.android.com/apk/res-auto"
  xmlns:tools="https://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.theitroad.bundles.MainActivity">

  <TextView
      android:id="@+id/txtString"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="String from MainActivity"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent" 

  <TextView
      android:id="@+id/txtBoolean"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Boolean value from MainActivity"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      android:layout_marginTop="8dp"
      app:layout_constraintTop_toBottomOf="@+id/txtString" 

</android.support.constraint.ConstraintLayout>

下面给出了MainActivity.java的代码。

package com.theitroad.bundles;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

  Button btnPassBundles, btnNoPassBundle;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      btnPassBundles = findViewById(R.id.btnPassBundles);
      btnNoPassBundle = findViewById(R.id.btnNoPassBundle);
      btnPassBundles.setOnClickListener(this);
      btnNoPassBundle.setOnClickListener(this);
  }

  @Override
  public void onClick(View view) {
      switch (view.getId()) {
          case R.id.btnPassBundles:

              Bundle bundle = new Bundle();
              bundle.putString("key_1", "MainActivity greeted you with a HI");
              bundle.putBoolean("key_2", true);
              
              Intent intent = new Intent(MainActivity.this, SecondActivity.class);
              intent.putExtras(bundle);
              startActivity(intent);

              break;
          case R.id.btnNoPassBundle:

              bundle = new Bundle();
              bundle.putString("key_1", "This string shall be displayed in the SecondActivity");
              bundle.putBoolean("key_2", true);
              bundle.clear();

              intent = new Intent(MainActivity.this, SecondActivity.class);
              intent.putExtras(bundle);
              startActivity(intent);

              break;

      }
  }
}

下面给出了" SecondActivity.java"的代码。

package com.theitroad.bundles;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

  TextView txtString, txtBoolean;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_second);

      txtString = findViewById(R.id.txtString);
      txtBoolean = findViewById(R.id.txtBoolean);

      Bundle bundle = getIntent().getExtras();
      txtString.setText(bundle.getString("key_1", "No value from the MainActivity"));
      txtBoolean.setText("Does bundle contain data? " + bundle.getBoolean("key_2", false));

  }
}