在Bundle中传递多个值,在最后一个字符串中分配的值被传递给所有字符串

Posted

技术标签:

【中文标题】在Bundle中传递多个值,在最后一个字符串中分配的值被传递给所有字符串【英文标题】:Passing Multiple value in Bundle, value assigned in last String is getting passed to all string 【发布时间】:2017-07-10 01:39:50 【问题描述】:

我正在尝试通过 Bundle 将 9 个字符串从一个 java 类传递到另一个类。但是在另一个屏幕中,分配给 last extra 的值会被所有其他字符串覆盖。

第一类

public class HomeScreen extends AppCompatActivity 

public  static String  Buy_Price;
public  static String  Sell_Price;
public  static String  QUANTITY;
public  static String  BROKERAGE;
public  static String  ActualProfitLoss_String;
public  static String  TurnOver_String;
public  static String  STT_String;
public  static String  ServiceTax_String;
public  static String  TotalCharge_String;
public  static String  x;
private static  String Strin ;

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


public void calculateProfit(View view) 
    Intent intent = new Intent(this, displayProfit.class);
    Bundle extras =new Bundle();
    EditText editText=(EditText) findViewById(R.id.editText);
    EditText editText4=(EditText) findViewById(R.id.editText4);
    EditText editText2=(EditText) findViewById(R.id.editText2);
    EditText editText3=(EditText) findViewById(R.id.editText3);

    String buyPriceString = editText3.getText().toString();
    Float BuyPrice =  Float.parseFloat(buyPriceString);
    String quantityString = editText2.getText().toString();
    Float Quantity =  Float.parseFloat(quantityString);
    String sellPriceString = editText4.getText().toString();
    Float SellPrice =  Float.parseFloat(sellPriceString);
    String brokerageString = editText.getText().toString();
    Float Brokerage =  Float.parseFloat(brokerageString);

    double TurnOver=(BuyPrice*Quantity)+(SellPrice*Quantity);
    double Sell1 =SellPrice-(SellPrice*(Brokerage/100));
    double Buy1 = BuyPrice+(BuyPrice*(Brokerage/100));
    double TotalBrokerage = ((Sell1*.03)+(Buy1*0.3));
    double STT = (Quantity*(SellPrice-(SellPrice*(Brokerage/100))))*(.025/100);
    double TrnxChrge = TurnOver*(0.00275/100);
    double ServiceTax = (TotalBrokerage+STT)*(15/100);
    double SEBICharge = (TurnOver*(.0002/100));
    double TotalCharge = ServiceTax+TrnxChrge+SEBICharge+STT;
    double NetProfit = (Sell1-Buy1)*Quantity;
    double ActualProfitLoss = (NetProfit -TotalCharge);


    String ActualProfitLossString=Double.toString(ActualProfitLoss);
    String TurnOverString=Double.toString(TurnOver);
    String STTString=Double.toString(STT);
    String ServiceTaxString=Double.toString(ServiceTax);
    String TotalChargeString=Double.toString(TotalCharge);


    extras.putString(ActualProfitLoss_String,ActualProfitLossString);
    extras.putString(TurnOver_String,TurnOverString);
    extras.putString(STT_String,STTString);
    extras.putString(ServiceTax_String,ServiceTaxString);
    extras.putString(TotalCharge_String,TotalChargeString);
    extras.putString(Buy_Price,buyPriceString);
    extras.putString(Sell_Price,sellPriceString);
    extras.putString(BROKERAGE,brokerageString);
    extras.putString(QUANTITY,quantityString);
    intent.putExtras(extras);

    startActivity(intent);


第 2 类:

public class displayProfit extends AppCompatActivity 


private static  String Strin ;

protected void onCreate(Bundle savedInstanceState) 
    Log.d(Strin, "buyPrice :::");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_profit);

    Intent intent =getIntent();
    Bundle extras = intent.getBundleExtra(HomeScreen.x);
    String Buy_Price = extras.getString(HomeScreen.Buy_Price);
    String Sell_Price = extras.getString(HomeScreen.Sell_Price);
    String QUANTITY = extras.getString(HomeScreen.QUANTITY);
    String BROKERAGE = extras.getString(HomeScreen.BROKERAGE);
    String ActualProfitLoss_String = extras.getString(HomeScreen.ActualProfitLoss_String);
    String TurnOver_String = extras.getString(HomeScreen.TurnOver_String);
    String STT_String = extras.getString(HomeScreen.STT_String);
    String ServiceTax_String = extras.getString(HomeScreen.ServiceTax_String);
    String TotalCharge_String = extras.getString(HomeScreen.TotalCharge_String);


    TextView Buy_Price1= (TextView) findViewById(R.id.Buy_Price1);
    TextView Sell_Price1= (TextView) findViewById(R.id.Sell_Price1);
    TextView QUANTITY1= (TextView) findViewById(R.id.QUANTITY1);
    TextView BROKERAGE1= (TextView) findViewById(R.id.BROKERAGE1);
    TextView ActualProfitLoss_String1= (TextView) findViewById(R.id.ActualProfitLoss_String1);
    TextView TurnOver_String1= (TextView) findViewById(R.id.TurnOver_String1);
    TextView STT_String1= (TextView) findViewById(R.id.STT_String1);
    TextView ServiceTax_String1= (TextView) findViewById(R.id.ServiceTax_String1);
    TextView TotalCharge_String1= (TextView) findViewById(R.id.TotalCharge_String1);


    Buy_Price1.setText(Buy_Price);
    Sell_Price1.setText(Sell_Price);
    QUANTITY1.setText(QUANTITY);
    BROKERAGE1.setText(BROKERAGE);
    ActualProfitLoss_String1.setText(ActualProfitLoss_String);
    TurnOver_String1.setText(TurnOver_String);
    STT_String1.setText(STT_String);
    ServiceTax_String1.setText(ServiceTax_String);
    TotalCharge_String1.setText(TotalCharge_String);




在 class2 的末尾,我放置了日志,发现分配给 QUANTITY 的值正在为所有字符串填充。

请澄清以上内容。如果您需要更多代码,将共享相同的代码。

按照答案中的建议更改 Class1 后记录相同

W/IInputConnectionWrapper:非活动 InputConnection 上的 finishComposingText W/IInputConnectionWrapper:非活动 InputConnection 上的 finishComposingText W/IInputConnectionWrapper:非活动 InputConnection 上的 finishComposingText I/art:后台粘滞并发标记扫描 GC 释放 25273(2MB) 个 AllocSpace 对象,15(264KB) LOS 对象,44% 空闲,4MB/8MB,暂停 14.345ms 共 168.562ms

       [ 02-20 23:21:14.614  3314: 3314 D/         ]

购买价格 :::

[02-20 23:21:14.861 3314:3314 D/] 非空::::::: D/androidRuntime: 关闭虚拟机

       --------- beginning of crash

E/AndroidRuntime: 致命异常: main 进程:com.test.tax,PID:3314 java.lang.RuntimeException:无法启动活动 ComponentInfocom.test.tax/com.test.tax.displayProfit:java.lang.NullPointerException:尝试调用虚拟方法'java.lang.String android.os.Bundle。空对象引用上的 getString(java.lang.String)' 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.os.Bundle.getString(java.lang.String)” 在 com.test.tax.displayProfit.onCreate(displayProfit.java:29) 在 android.app.Activity.performCreate(Activity.java:6662) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 与目标VM断开连接,地址:'localhost:8625',传输:'socket'

【问题讨论】:

请分享分配给HomeScreen.QUANTITYHomeScreen.BROKERAGEHomeScreen.Sell_Price等的值 @AdityaSharat 编辑了我的问题。添加了整个代码。 在 Class 1 (HomeScreen) 中必须有 public static String ActualProfitLoss_Stringpublic static String QUANTITY 等。请添加该部分代码。 HomeScreen 中的所有九个 public static String 字段 添加了除导入之外的第 1 类的整个代码 【参考方案1】:

只需初始化所有上述public static Strings,您将使用它们将项目添加到具有唯一值的Bundle,否则它们将相互覆盖。例如。

public  static String  Buy_Price = "a";
public  static String  Sell_Price = "b";
public  static String  QUANTITY = "c";
public  static String  BROKERAGE = "d";
public  static String  ActualProfitLoss_String = "e";
public  static String  TurnOver_String = "f";
public  static String  STT_String = "g";
public  static String  ServiceTax_String = "h";
public  static String  TotalCharge_String = "i";
public  static String  x =  = "j";

此外,理想情况下,它们应该是public static final String。请考虑使用一致的命名约定(TOTAL_CHARGE、TURN_OVER)。

你可以把Bundle 想象成一个Map,如果你用相同的键放置值,这些值将被覆盖。这就是为什么您在所有键中都获得了QUANTITY 的值,因为所有键都是空(相等)并且QUANTITY 是您放入Bundle 中的最后一个键。

编辑: 对于NullPointerException

calculateProfit(View view) 方法内的第 1 类(HomeScreen)中,您将 Bundle 放入 Intent 中而不使用密钥。

intent.putExtras(extras);

然后在 onCreate(Bundle savedInstanceState) 内的 Class 2 (displayProfit) 中,您可以使用密钥从 Intent 获得 Bundle

intent.getBundleExtra(HomeScreen.x);

所以像这样在 HomeScreen 中使用相同的键放置额外内容

intent.putExtra(HomeScreen.x, extras);

【讨论】:

相应地更改代码后,我遇到了错误。 D/AndroidRuntime: 关闭 VM --------- 崩溃开始 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.test.tax, PID: 3314 java.lang.RuntimeException: Unable to start activity ComponentInfo com.test.tax/com.test.tax.displayProfit:java.lang.NullPointerException:尝试在 null 上调用虚拟方法“java.lang.String android.os.Bundle.getString(java.lang.String)”对象引用 尝试干净构建您的应用程序。可能是因为即时运行启动了打开的活动。另外,分享整个日志,使用 pastebin 或 github gists :) 在我的问题中添加了日志和 2 类代码。请检查 第 29 行出现错误,即 String Buy_Price = extras.getString(HomeScreen.Buy_Price); 是的,这是因为在第 28 行:Bundle extras = intent.getBundleExtra(HomeScreen.x); extras 为空。我已经更新了答案。请检查一下,您需要在 HomeScreen 中进行一项更改。

以上是关于在Bundle中传递多个值,在最后一个字符串中分配的值被传递给所有字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中分配空值或字符串

在Python中分配多个值时的奇怪问题[重复]

在数据集 Excel 中分配的最后一行不正确

如何在另一个外部类变量中分配进度条的值来执行计算?

是否可以在单个变量(批处理文件)中分配多个值?如果没有,有没有办法以更有效的方式运行它?

在c中分配空间并连接到无符号字符数组