如何从 Android 上的意图中获取额外数据?
Posted
技术标签:
【中文标题】如何从 Android 上的意图中获取额外数据?【英文标题】:How do I get extra data from intent on Android? 【发布时间】:2021-04-10 22:12:26 【问题描述】:如何将数据从一个活动(意图)发送到另一个活动?
我用这段代码发送数据:
Intent i=new Intent(context,SendMessage.class);
i.putExtra("id", user.getUserAccountId()+"");
i.putExtra("name", user.getUserFullName());
context.startActivity(i);
【问题讨论】:
Java 旁注:像这样“字符串化”整数从来都不是一个好主意(尤其是出于示例目的),不幸的是,它经常被认为是在 java 中将 int 转换为字符串的好方法:user.getUserAccountId()+""
,因为这会创建不必要的对象来收集。考虑改用String.valueOf(user.getUserAccountId)
或Integer.toString(user.getUserAccountId)
。
@Andrew S 这不是网络吗?这是“从意图中获取数据”的第一结果
@AndrewS 我同意麦奎尔的观点。另外,这个问题是不久前发布的,所以当时可能不太容易找到答案。如果还没有向 SO 发布类似问题,那么它就是有效的帖子。
【参考方案1】:
首先,使用getIntent()
方法获取启动活动的意图:
Intent intent = getIntent();
如果您的额外数据表示为字符串,那么您可以使用intent.getStringExtra(String name)
方法。在你的情况下:
String id = intent.getStringExtra("id");
String name = intent.getStringExtra("name");
【讨论】:
从哪里可以得到所有这些方法?? @adham:如果您在活动中,从 onCreate 中调用getIntent().getStringExtra("id");
以获取 id 字符串
您可以通过调用getIntent()
方法获取启动活动的意图。我已经更新了答案。
@Eatlon 如果您对特定库有疑问,您应该为此创建一个单独的问题。
@MelColm getExtra().getString 和 getStringExtra() 有什么区别?【参考方案2】:
在接收活动中
Bundle extras = getIntent().getExtras();
String userName;
if (extras != null)
userName = extras.getString("name");
// and get whatever type user account id is
【讨论】:
为什么这比getStringExtra?
更可取
我的猜测是:如果 extras 可以是null
,则可以跳过整个 extras 获取。通过使用getStringExtra
,您基本上将其更改为一系列if(extras != null) return extras.getString(name)
。您拨打的每个getStringExtra
一个。此选项将检查null
一次,如果是,则根本不会阅读Bundle
。除此之外,getStringExtra
可能还会每次在内部不断询问getExtras
。因此,您只需对函数进行更多调用。【参考方案3】:
// How to send value using intent from one class to another class
// class A(which will send data)
Intent theIntent = new Intent(this, B.class);
theIntent.putExtra("name", john);
startActivity(theIntent);
// How to get these values in another class
// Class B
Intent i= getIntent();
i.getStringExtra("name");
// if you log here i than you will get the value of i i.e. john
【讨论】:
【参考方案4】:如果您想在片段中获取额外数据,那么您可以尝试使用:
使用以下方式放置数据:
Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER);
使用以下方法获取数据:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
getArguments().getInt(ARG_SECTION_NUMBER);
getArguments().getString(ARG_SECTION_STRING);
getArguments().getBoolean(ARG_SECTION_BOOL);
getArguments().getChar(ARG_SECTION_CHAR);
getArguments().getByte(ARG_SECTION_DATA);
【讨论】:
【参考方案5】:如果在 FragmentActivity 中使用,试试这个:
第一页扩展FragmentActivity
Intent Tabdetail = new Intent(getApplicationContext(), ReceivePage.class);
Tabdetail.putExtra("Marker", marker.getTitle().toString());
startActivity(Tabdetail);
在片段中,你只需要先调用getActivity()
,
第二页扩展片段:
String receive = getActivity().getIntent().getExtras().getString("name");
【讨论】:
你也可以使用 getStringExtra("name") 代替 getExtras().getString("name")【参考方案6】:不要初始化另一个新的 Intent 来接收数据,只需这样做:
String id = getIntent().getStringExtra("id");
【讨论】:
【参考方案7】:只是一个建议:
我建议不要在 i.putExtra("id".....) 中使用“id”或“name”,而是在有意义的时候使用可与 putExtra( ),即 Intent.EXTRA_something。
完整列表可在 Intent(android 开发者)上找到。
【讨论】:
【参考方案8】:加起来
设置数据
String value = "Hello World!";
Intent intent = new Intent(getApplicationContext(), NewActivity.class);
intent.putExtra("sample_name", value);
startActivity(intent);
获取数据
String value;
Bundle bundle = getIntent().getExtras();
if (bundle != null)
value = bundle.getString("sample_name");
【讨论】:
【参考方案9】:你也可以这样做 // 将值放入意图中
Intent in = new Intent(MainActivity.this, Booked.class);
in.putExtra("filter", "Booked");
startActivity(in);
// 从意图中获取价值
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String filter = bundle.getString("filter");
【讨论】:
【参考方案10】:我们可以通过简单的方式做到这一点:
在 FirstActivity 中:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("uid", uid.toString());
intent.putExtra("pwd", pwd.toString());
startActivity(intent);
在 SecondActivity 中:
try
Intent intent = getIntent();
String uid = intent.getStringExtra("uid");
String pwd = intent.getStringExtra("pwd");
catch (Exception e)
e.printStackTrace();
Log.e("getStringExtra_EX", e + "");
【讨论】:
【参考方案11】:从 Intent 中获取不同类型的 Extra
要从 Intent 访问数据,您应该知道两件事。
键 数据的数据类型。Intent 类中有不同的方法来提取不同类型的数据类型。 看起来是这样的
getIntent().XXXX(KEY) 或 intent.XXX(KEY);
因此,如果您知道在 otherActivity 中设置的变量的数据类型,则可以使用相应的方法。
从 Intent 中检索 Activity 中的字符串的示例
String profileName = getIntent().getStringExtra("SomeKey");
不同数据类型的不同方法变体列表
您可以在Intent的官方文档中查看可用方法的列表。
【讨论】:
【参考方案12】:这是针对适配器的,对于活动,您只需要更改 mContext 到您的 Activty 名称和片段,您需要将 mContext 更改为 获取活动()
public static ArrayList<String> tags_array ;// static array list if you want to pass array data
public void sendDataBundle()
tags_array = new ArrayList();
tags_array.add("hashtag");//few array data
tags_array.add("selling");
tags_array.add("cityname");
tags_array.add("more");
tags_array.add("mobile");
tags_array.add("android");
tags_array.add("dress");
Intent su = new Intent(mContext, ViewItemActivity.class);
Bundle bun1 = new Bundle();
bun1.putString("product_title","My Product Titile");
bun1.putString("product_description", "My Product Discription");
bun1.putString("category", "Product Category");
bun1.putStringArrayList("hashtag", tags_array);//to pass array list
su.putExtras(bun1);
mContext.startActivity(su);
【讨论】:
【参考方案13】:您可以从意图中获取任何类型的额外数据,无论是对象、字符串还是任何类型的数据。
Bundle extra = getIntent().getExtras();
if (extra != null)
String str1 = (String) extra.get("obj"); // get a object
String str2 = extra.getString("string"); //get a string
最短的解决方案是:
Boolean isGranted = getIntent().getBooleanExtra("tag", false);
【讨论】:
【参考方案14】:在第一个活动上传递带有值的意图:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("uid", uid.toString());
intent.putExtra("pwd", pwd.toString());
startActivity(intent);
接收第二个 Activity 的意图;-
Intent intent = getIntent();
String user = intent.getStringExtra("uid");
String pass = intent.getStringExtra("pwd");
我们通常使用两种方法来发送值和获取值。
为了发送值,我们将使用intent.putExtra("key", Value);
,在接收另一个活动的意图期间,我们将使用intent.getStringExtra("key");
来获取意图数据为String
或使用其他可用方法来获取其他类型的数据(Integer
,@ 987654327@等)。
关键可以是任何关键字来识别价值意味着你正在分享什么价值。
希望它对你有用。
【讨论】:
【参考方案15】:科特林
第一个活动
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)
第二次活动
val value = getIntent().getStringExtra("key")
建议
始终将密钥放在常量文件中以获得更多管理方式。
companion object
val PUT_EXTRA_USER = "PUT_EXTRA_USER"
【讨论】:
【参考方案16】:按意图放置数据:
Intent intent = new Intent(mContext, HomeWorkReportActivity.class);
intent.putExtra("subjectName", "Maths");
intent.putExtra("instituteId", 22);
mContext.startActivity(intent);
按意图获取数据:
String subName = getIntent().getStringExtra("subjectName");
int insId = getIntent().getIntExtra("instituteId", 0);
如果我们对 Intent 使用整数值,我们必须将 getIntent().getIntExtra("instituteId", 0)
中的第二个参数设置为 0。否则,我们不使用 0,Android 会给我一个错误。
【讨论】:
以上是关于如何从 Android 上的意图中获取额外数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在android编程中获取放置在小部件上的textview文本