使用 getParcelableExtra() 从不同的活动中获取价值
Posted
技术标签:
【中文标题】使用 getParcelableExtra() 从不同的活动中获取价值【英文标题】:getting value from different activities with getParcelableExtra() 【发布时间】:2021-03-07 04:40:34 【问题描述】:我有两个活动,分别称为 DrinksActivity
和 FoodsActivity
。两者都有自己的RecyclerViews
来显示项目。
它们运行良好,但我必须将它们的值传递给另一个名为..sample_activity
的活动。
这就是sample_activity
的样子。
public class sample_layout extends AppCompatActivity
private DrawerLayout dl;
private ActionBarDrawerToggle t;
private NavigationView nv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.sample_layout);
SetTexts();
Navigation();
TextView textView = findViewById(R.id.txtFoodName);
Intent intent = getIntent();
DrinksModel drinksM = intent.getParcelableExtra("drinks");
FoodModel foodM = intent.getParcelableExtra("foods");
//how can i set the textView from their own getParcelableExtra values
String FoodName = foodM.getFoodName();
textView.setText(FoodName);
//how can i set the textView from their own getParcelableExtra values
String DrinkName = drinksM.getDrinkName();
textView.setText(DrinkName);
public String getName(String email)
String stringList = null;
DatabaseHelperAccounts db = new DatabaseHelperAccounts(this);
SQLiteDatabase dbb = db.getWritableDatabase();
String selectQuery = "SELECT FullName FROM " + db.DATABASE_TABLE + " WHERE email = '" + email + "'";
Cursor c = dbb.rawQuery(selectQuery, null);
if (c != null)
c.moveToFirst();
while (c.isAfterLast() == false)
String name2 = (c.getString(c.getColumnIndex("FullName")));
stringList = name2;
c.moveToNext();
return stringList;
public void SetTexts()
String StringEmail = LoginFragment.EmailString;
NavigationView nav_view = (NavigationView) findViewById(R.id.nv);//this is navigation view from my main xml where i call another xml file
View header = nav_view.getHeaderView(0);//set View header to nav_view first element (i guess)
TextView UserFullNameNav = (TextView) header.findViewById(R.id.UserFullNameNav);//now assign textview imeNaloga to header.id since we made View header.
TextView UserEmailNav = (TextView) header.findViewById(R.id.UserEmailNav);
getName(StringEmail);
UserEmailNav.setText(StringEmail);// And now just set text to that textview
UserFullNameNav.setText(getName(StringEmail));
public void Navigation()
dl = findViewById(R.id.sampleLayout);
t = new ActionBarDrawerToggle(this, dl, R.string.open, R.string.close);
dl.addDrawerListener(t);
t.syncState();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
nv = findViewById(R.id.nv);
nv.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener()
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item)
int id = item.getItemId();
switch (id)
case R.id.itemDrinks:
Intent DrinksIntent = new Intent(getApplicationContext(), DrinksActivity.class);
startActivity(DrinksIntent);
break;
case R.id.itemFoods:
Intent FoodsIntent = new Intent(getApplicationContext(), FoodsActivity.class);
startActivity(FoodsIntent);
break;
case R.id.itmLogout:
Intent LogOut = new Intent(getApplicationContext(), MainActivity.class);
startActivity(LogOut);
finish();
default:
return true;
return true;
);
@Override
public boolean onOptionsItemSelected(@NonNull 'MenuItem' item)
if ( t.onOptionsItemSelected(item))
return true;
return super.onOptionsItemSelected(item);
从该特定活动的回收站视图中选择该项目时,我如何获得该项目的价值?
【问题讨论】:
分享您打开此活动的代码。 这是调用者活动。被调用的活动的方法如下所示。@Override public void onNoteClick(int position) Intent intent = new Intent(this,sample_layout.class ); intent.putExtra("drinks", DrinksList.get(position));开始活动(意图); 从其他活动来看,它看起来像这样.. @Override public void onNoteClick(int position) // FoodList.get(position) Intent intent = new Intent(this, sample_layout.class) ; intent.putExtra(“食物”,FoodList.get(位置));开始活动(意图); ; 你能分享整个代码吗?我需要检查列表位置的值。 【参考方案1】:尝试使用这个
if (getIntent()!=null )
if (getIntent.hasExtra("drinks"))
DrinksModel drinksM = intent.getParcelableExtra("drinks");
String DrinkName = drinksM.getDrinkName();
textView.setText(DrinkName);
else if(getIntent.hasExtra("foods"))
FoodModel foodM = intent.getParcelableExtra("foods");
String FoodName = foodM.getFoodName();
textView.setText(FoodName);
【讨论】:
如果对您有用,请为答案投票。它也会帮助其他人。【参考方案2】:我可以看到您正在使用数据库来存储数据,对吗?如果是这样,最好(也是最正确)的方法是在活动之间传递一些标识符(如“id”),然后从您需要的数据库中通过该 id 获取值。但是,如果您真的想传递整个对象,那么您需要使用可序列化或可打包(可打包是更好的选择,因为它来自 android SDK)。然后在你获取值的活动中解析它。
编辑: 要获得可打包的价值调用:
Food food = getIntent().getExtras().getParcelable("food");
然后只需调用:
textView.setText(food.getYourField);
【讨论】:
我没有使用数据库,它们只是来自 string.xml 文件的值。是的,我正在使用 parcelable 那么这就是你需要的:getIntent().getExtras().getParcelable("food") 你应该有这样的东西: Food food = getIntent().getExtras().getParcelable("food");只需调用 textView.setText(food.getYourField);以上是关于使用 getParcelableExtra() 从不同的活动中获取价值的主要内容,如果未能解决你的问题,请参考以下文章
intent.getParcelableExtra() 仅在第一次发送推送通知时返回空值
Android getParcelableExtra传入畸形数据导致APP崩溃Crash复现及原因分析