Передача нескольких значений в Bundle, значение, назначенное в последней строке, передается всей строке

Я пытаюсь передать 9 строк из одного класса Java в другой класс через Bundle. Но на другом экране значение, присвоенное последней дополнительной строке, перезаписывается для всех остальных строк.

Класс 1

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);

}

}

В конце класса 2 я поместил журнал и обнаружил, что значение, присвоенное КОЛИЧЕСТВУ, заполняется для всей строки.

Пожалуйста, поясните вышеизложенное. Если вам нужно больше кода, он будет делиться тем же.

Журналы для того же после изменения Class1, как предложено в ответе

W/IInputConnectionWrapper: FinishComposingText для неактивного InputConnection W/IInputConnectionWrapper: FinishComposingText для неактивного InputConnection W/IInputConnectionWrapper: FinishComposingText для неактивного InputConnection I/art: фоновая липкая одновременная развертка меток GC освобождает 25273 (2 МБ) объектов AllocSpace, 15 (264 КБ) объектов LOS, 44 % свободно, 4 МБ/8 МБ, приостановлено 14,345 мс, всего 168,562 мс

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

цена покупки :::

[ 02-20 23:21:14.861 3314: 3314 D/ ] NotNull:::::: D/AndroidRuntime: завершение работы виртуальной машины

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

E/AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.test.tax, PID: 3314 java.lang.RuntimeException: невозможно запустить активность ComponentInfo{com.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.interna l.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) Отключено от целевой ВМ, адрес: 'localhost:8625', транспорт: 'разъем'


person Pavithran    schedule 20.02.2017    source источник
comment
пожалуйста, поделитесь значениями, присвоенными HomeScreen.QUANTITY, HomeScreen.BROKERAGE, HomeScreen.Sell_Price и т. д.   -  person vader    schedule 20.02.2017
comment
@AdityaSharat Отредактировал мой вопрос. Добавлен весь код.   -  person Pavithran    schedule 20.02.2017
comment
В классе 1 (HomeScreen) должны быть public static String ActualProfitLoss_String, public static String QUANTITY и т. д. Добавьте эту часть кода. Все девять полей public static String в HomeScreen   -  person vader    schedule 20.02.2017
comment
Добавлен весь код класса 1, кроме импорта   -  person Pavithran    schedule 20.02.2017


Ответы (1)


Просто инициализируйте все вышеперечисленные public static String, которые вы используете для добавления элементов в 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 как карту, если вы поместите значения с одним и тем же ключом, значения будут переопределены. Вот почему вы получили значение QUANTITY для всех ключей, потому что все ключи были нулевыми (равными), а QUANTITY был последним ключом, который вы поместили в Bundle.

РЕДАКТИРОВАТЬ: Для NullPointerException.

В классе 1 (HomeScreen) внутри метода calculateProfit(View view) вы помещаете Bundle в Intent без ключа.

intent.putExtras(extras);

Затем в классе 2 (displayProfit) внутри onCreate(Bundle savedInstanceState) вы получаете Bundle из Intent с помощью ключа.

intent.getBundleExtra(HomeScreen.x);

Так что поместите дополнения, используя ту же клавишу на главном экране, вот так

intent.putExtra(HomeScreen.x, extras);
person vader    schedule 20.02.2017
comment
После изменения кода соответственно я получаю ошибку ниже. D/AndroidRuntime: завершение работы виртуальной машины --------- начало сбоя E/AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.test.tax, PID: 3314 java.lang.RuntimeException: невозможно запустить активность ComponentInfo{ com.test.tax/com.test.tax.displayProfit}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String android.os.Bundle.getString(java.lang.String)' для нулевого значения ссылка на объект - person Pavithran; 20.02.2017
comment
попробуйте чистую сборку вашего приложения. может быть из-за мгновенного запуска, который запускает открытое действие. Кроме того, поделитесь всем журналом, используйте pastebin или github gists :) - person vader; 20.02.2017
comment
Добавил журналы и код класса 2 в мой вопрос. пожалуйста, проверьте - person Pavithran; 20.02.2017
comment
ошибка возникает в строке 29, т.е. String Buy_Price = extras.getString(HomeScreen.Buy_Price); - person Pavithran; 20.02.2017
comment
да, это потому, что в строке 28 : Bundle extras = intent.getBundleExtra(HomeScreen.x); extras равно null. Я обновил ответ. пожалуйста, проверьте это, вам нужно внести одно изменение в HomeScreen. - person vader; 20.02.2017
comment
ссылка на это, поэтому ответ на вопрос stackoverflow.com/questions/4233873/ - person vader; 20.02.2017
comment
Да, это сработало после удаления Bundle extras = намерение.getBundleExtra(HomeScreen.x); Спасибо. - person Pavithran; 21.02.2017