Пакет для Android с примером
Известно, что Intents используются в Android для передачи данных от одного действия к другому. Но есть еще один способ, который можно использовать для передачи данных от одного действия другому лучше и с меньшим пространством кода, то есть с помощью Bundles в Android. Пакеты Android обычно используются для передачи данных от одного действия к другому. В основном здесь используется концепция пары ключ-значение, когда данные, которые нужно передать, являются значением карты, которое позже можно получить с помощью ключа. Пакеты используются с намерением, а значения отправляются и извлекаются таким же образом, как это делается в случае с намерением. Это зависит от пользователя, какой тип значений он хочет передать, но пакеты могут содержать все типы значений (int, String, boolean, char) и передавать их новому действию.
Ниже приведены основные типы, которые передаются / извлекаются в / из Bundle:
putInt(String key, int value), getInt(String key, int value)
putString(String key, String value), getString(String key, String value)
putStringArray(String key, String[] value), getStringArray(String key, String[] value)
putChar(String key, char value), getChar(String key, char value)
putBoolean(String key, boolean value), getBoolean(String key, boolean value)
Использование пакета в приложении для Android
Пакет всегда используется с Intent в Android. Теперь, чтобы использовать Bundle, запишите приведенный ниже код в MainActivity.
Джава
// creating a intent Intent intent = new Intent( this , SecondActivity. class ); // creating a bundle object Bundle bundle = new Bundle(); // storing the string value in the bundle // which is mapped to key bundle.putString( "key1" , "GFG :- Main Activity" ); // passing the bundle into the intent intent.putExtras(bundle); // starting the intent startActivity(intent); |
Котлин
// creating the instance of the bundle val bundle = Bundle() // storing the string value in the bundle // which is mapped to key bundle.putString( "key1" , "Gfg :- Main Activity" ) // creating a intent intent = Intent( this @MainActivity , SecondActivity:: class .java) // passing a bundle to the intent intent.putExtras(bundle) // starting the activity by passing the intent to it. startActivity(intent) |
Теперь создайте еще одно пустое действие с именем SecondActivity. Теперь, чтобы получить данные, хранящиеся в Bundle, напишите следующий код в SecondActivity.
Java
// getting the bundle back from the android Bundle bundle = getIntent().getExtras(); // getting the string back String title = bundle.getString( "key1" , "Default" ); |
Kotlin
// getting the bundle back from the android val bundle = intent.extras // performing the safety null check var s:String? = null // getting the string back s = bundle!!.getString( "key1" , "Default" )) |
В качестве альтернативы, если кто-то также не хочет использовать значение по умолчанию, это можно сделать, но помните, что это вызывает исключение.
For eg: boolean b = bundle.getBoolean(“pass the key here”);
Если не существует сопоставления, соответствующего ключу, это может привести к исключению NullPointerException. Следовательно, рекомендуется добавить значения по умолчанию для Bundle.
Пример
Шаг 1. Создайте новый проект
- Щелкните Файл, затем Новый => Новый проект.
- Выберите Пустое действие
- Выберите язык как Java / Kotlin
- Выберите минимальный SDK в соответствии с вашими потребностями.
Шаг 2. Работа с файлом activity_main.xml
Теперь добавьте две кнопки в приложение, одна кнопка будет передавать данные, которые хранятся в пакете, а другая кнопка будет передавать пустой пакет, т.е. очистить пакет с помощью bundle.clear (), а затем передать пакет в Intent. Полный код файла activity_main.xml приведен ниже. Здесь видно, что первая кнопка используется для передачи непустого пакета, а вторая кнопка используется для передачи пустого пакета.
XML
<? xml version = "1.0" encoding = "utf-8" ?> < androidx.constraintlayout.widget.ConstraintLayout android:layout_width = "match_parent" android:layout_height = "match_parent" android:padding = "10dp" tools:context = ".MainActivity" > < Button android:id = "@+id/btnPassBundles" android:layout_width = "275dp" android:layout_height = "101dp" android:layout_marginTop = "250dp" android:text = "Pass Data Into Bundle" android:textSize = "24sp" app:layout_constraintHorizontal_bias = "0.498" app:layout_constraintLeft_toLeftOf = "parent" app:layout_constraintRight_toRightOf = "parent" app:layout_constraintTop_toTopOf = "parent" /> < Button android:id = "@+id/btnNoPassBundle" android:layout_width = "277dp" android:layout_height = "92dp" android:layout_marginBottom = "220dp" android:layout_marginTop = "75dp" android:text = "Pass No Data/Empty BUNDLE" android:textSize = "24sp" app:layout_constraintBottom_toBottomOf = "parent" app:layout_constraintLeft_toLeftOf = "parent" app:layout_constraintRight_toRightOf = "parent" app:layout_constraintTop_toBottomOf = "@+id/btnPassBundles" /> </ androidx.constraintlayout.widget.ConstraintLayout > |
Шаг 3. Создайте другое действие и назовите его SecondActivity.
Теперь создайте еще одно пустое действие с именем SecondActivity. Следуйте процедуре, показанной на изображении ниже, чтобы создать другое действие.
Шаг 4. Работа с файлом activity_second.xml
В этом файле добавьте TextView для отображения текста в SecondActivity.
XML
<? xml version = "1.0" encoding = "utf-8" ?> < androidx.constraintlayout.widget.ConstraintLayout android:layout_width = "match_parent" android:layout_height = "match_parent" tools:context = ".SecondActivity" > < TextView android:id = "@+id/txtString" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_marginTop = "348dp" android:text = "String from MainActivity" android:textSize = "40sp" android:textStyle = "bold" android:gravity = "center" android:textColor = "#008000" app:layout_constraintHorizontal_bias = "0.428" app:layout_constraintLeft_toLeftOf = "parent" app:layout_constraintRight_toRightOf = "parent" app:layout_constraintTop_toTopOf = "parent" /> </ androidx.constraintlayout.widget.ConstraintLayout > |
Шаг 5: Работа с файлом MainActivity
Полный код MainActivity приведен ниже. Комментарии добавляются для облегчения понимания кода.
Джава
import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; 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); // one button will pass the bundle and other button // will not pass the bundle btnPassBundles.setOnClickListener( this ); btnNoPassBundle.setOnClickListener( this ); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btnPassBundles: // creating a bundle instance Bundle bundle = new Bundle(); // passing the data into the bundle bundle.putString( "key1" , "Passing Bundle From Main Activity to 2nd Activity" ); Intent intent = new Intent(MainActivity. this , SecondActivity. class ); // passing the bundle to the intent intent.putExtras(bundle); // starting the activity by passing the intent // to it. startActivity(intent); break ; case R.id.btnNoPassBundle: bundle = new Bundle(); bundle.putString( "key1" , "Not passing Bundle From Main Activity" ); // clearing the data stored into the bundle bundle.clear(); // passing the intent to the second activity intent = new Intent(MainActivity. this , SecondActivity. class ); intent.putExtras(bundle); startActivity(intent); break ; } } } |
Котлин
import android.content.Intent import android.os.Bundle import android.view.View import android.widget.Button import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity(), View.OnClickListener { var btnPassBundles: Button? = null var btnNoPassBundle: Button? = null override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout.activity_main) btnPassBundles = findViewById(R.id.btnPassBundles) btnNoPassBundle = findViewById(R.id.btnNoPassBundle) // one button will pass the bundle and other button // will not pass the bundle btnPassBundles?.setOnClickListener( this ) btnNoPassBundle?.setOnClickListener( this ) } override fun onClick(view: View) { when (view.id) { R.id.btnPassBundles -> { // creating the bundle instance val bundle = Bundle() // passing the data into the bundle bundle.putString( "key1" , "Passing Bundle From Main Activity to 2nd Activity" ) val intent = Intent( this @MainActivity , SecondActivity:: class .java) intent.putExtras(bundle) startActivity(intent) } R.id.btnNoPassBundle -> { val bundle = Bundle() bundle.putString( "key1" , "Not passing Bundle From Main Activity" ) // clearing the bundle bundle.clear() // passing the intent to the second activity intent = Intent( this @MainActivity , SecondActivity:: class .java) // passing the bundle into the intent intent.putExtras(bundle) startActivity(intent) } } } } |
Шаг 6: Работа с файлом SecondActivity
Полный код для SecondActivity приведен ниже. Комментарии добавляются для облегчения понимания кода.
Джава
import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class SecondActivity extends AppCompatActivity { TextView txtString; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_second); txtString = findViewById(R.id.txtString); // getting the bundle from the intent Bundle bundle = getIntent().getExtras(); // setting the text in the textview txtString.setText(bundle.getString( "key1" , "No value from the MainActivity" )); } } |
Котлин
import android.os.Bundle import android.widget.TextView import androidx.appcompat.app.AppCompatActivity class SecondActivity : AppCompatActivity() { var txtString: TextView? = null override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout.activity_second) txtString = findViewById(R.id.txtString) txtBoolean = findViewById(R.id.txtBoolean) // getting the bundle from the intent val bundle = intent.extras // setting the text in the textview txtString?.setText(bundle!!.getString( "key1" , "No value from MainActivity :(" )) } } |