【问题标题】:Pass variables between activity in Android app在 Android 应用中的活动之间传递变量
【发布时间】:2017-10-10 02:45:11
【问题描述】:

我一直在寻找答案,但仍然找不到,所以希望有人能帮助我解决这个问题。

我有 X 个活动,我想将这些活动的不同变量传递给一个活动。当我使用 Intent put extra 时,它从 1 个活动到最终活动都运行良好,但是当我从 2 个活动到最终活动使用它时,应用程序崩溃了。有人可以告诉我该怎么做吗?

这是一个 X 活动的示例代码:

public class AkyluxClass extends Activity {

//Initialisation
double prix;
EditText longueur;
EditText largeur;
EditText quantite;
TextView total;
Button calcul, facturer, valider;
float coefficient;
public final static String COEF = "coefficient";
String test;

double num1, num2, num3, resultat;

@Override


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.akylux);

    //Association layout / code
    prix = 10.90;
    longueur = (EditText) findViewById(R.id.longueur_akylux);
    largeur = (EditText) findViewById(R.id.largeur_akylux);
    quantite = (EditText) findViewById(R.id.quantite_akylux);
    total = (TextView) findViewById(R.id.total_akylux);
    calcul = (Button) findViewById(R.id.button_calcul_akylux);
    facturer = (Button) findViewById(R.id.button_facturer);
    valider = (Button) findViewById(R.id.valider_akylux);
    coefficient = getPreferences(MODE_PRIVATE).getFloat(COEF, 1);


    //Listener du bouton calcul
    calcul.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            num1 = Double.parseDouble(longueur.getText().toString());
            num2 = Double.parseDouble(largeur.getText().toString());
            num3 = Double.parseDouble(quantite.getText().toString());
            resultat = ((num1 * num2)/10000) * num3 * prix * coefficient;
            total.setText(Double.toString(resultat));

            if (num1 < 100) {
                num1 = 100;
            }
            if (num2 < 100) {
                num2 = 100;
            }

            if (num3 < 1) {
                num3 = 1;
            }


        }
    });


    //Listener du bouton valider
    valider.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String valStr = String.valueOf(resultat);
            Intent intent = new Intent(AkyluxClass.this, DevisClass.class);
            intent.putExtra("akylux", valStr);
            startActivity(intent);
             }
        });
    }
  }

这是最终活动的代码:

public class DevisClass extends Activity {

//Initialisation des variables
TextView valeur_akylux, valeur_blanc, valeur_carton, valeur_dibond, valeur_gris, valeur_pvc, total_Devis;
Button facturer;
double total_devis_double, resultat;
String total;


static AkyluxClass AkyluxClass;
static PvcClass PvcClass;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.devis);

    //Association layout / code
    facturer = (Button) findViewById(R.id.button_facturer);
    valeur_akylux = (TextView) findViewById(R.id.valeur_akylux_devis);
    valeur_blanc = (TextView) findViewById(R.id.valeur_blanc_devis);
    valeur_carton = (TextView) findViewById(R.id.valeur_carton_devis);
    valeur_dibond = (TextView) findViewById(R.id.valeur_dibond_devis);
    valeur_gris = (TextView) findViewById(R.id.valeur_gris_devis);
    valeur_pvc = (TextView) findViewById(R.id.valeur_pvc_devis);
    total_Devis = (TextView) findViewById(R.id.total_Devis);


    //On récupère la variable passée via l'intent de la première classe
    String akylux_extra = (String) getIntent().getSerializableExtra("akylux");

    //on l'attribue à un double pour avoir une valeur calculable
    double valaky = Double.parseDouble(akylux_extra.trim());

    //On l'affiche sur le label du layout
    valeur_akylux.setText(Double.toString(valaky));

    //Test : on l'attribue à un total
    total_devis_double = Double.parseDouble(valeur_akylux.getText().toString());

    //resultat = valaky + blanc + carton + dibond + gris + pvc;
      resultat = valaky;

    //On transforme le total en String
      total = String.valueOf(total_devis_double);

    //On affiche le String total
    total_Devis.setText(total);

    //Listener du bouton facturer
    facturer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(Intent.ACTION_SEND);
            i.setType("message/rfc822");
            i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"rayan@eprint.fr"});
            i.putExtra(Intent.EXTRA_SUBJECT, "Votre facture deviseur ePrint");
            i.putExtra(Intent.EXTRA_TEXT   , new String[]{"Voici le détail de votre facture : " , total, "total", "€"});
          //i.putExtra(Intent.EXTRA_TEXT   , new String[]{total});
            try {
                startActivity(Intent.createChooser(i, "Send mail..."));
            } catch (android.content.ActivityNotFoundException ex) {
                Toast.makeText(DevisClass.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
            }
        }
    });
}
}

感谢您的帮助

【问题讨论】:

  • 也添加其他活动代码。
  • 错误日志也会有所帮助。
  • @MilapPancholi 他们几乎都和第一个一样

标签: java android variables android-activity


【解决方案1】:

假设您有一个 Home Activity A 和许多其他 Activity B、C、D,您希望将这些数据发送到 Activity A。

在活动A中,声明一个字符串标签:

public static final String    TAG_ACTIVITY_FROM = "WhichActivity";

在其他活动中,发送:

//you can send as many data as you want in putExtra

     Intent intent = new Intent(D.this, A.class);
        intent.putExtra(A.TAG_ACTIVITY_FROM, "From_D");
    intent.putExtra(A.VALUE, 4);
        startActivity(intent);

在 A 中,用 :

取回它
 if (getIntent().getExtras() != null) {
            String activityFrom =(String)getIntent().getStringExtra(TAG_ACTIVITY_FROM);
int value = getIntent().getIntExtra(VALUE, -1);
        }

【讨论】:

  • 获取数据时使用 getIntent().getDoubleExtra("akylux", -1);
  • bcz 你传递的是双精度值
  • 嗨,看起来它可以工作,但我应该放什么而不是 -1 ?当我运行该应用程序时,它只会出现“-1”
  • public double getDoubleExtra (String name, double defaultValue) 所以第二个参数将是您的 String 变量不包含任何值时获得的默认值。
  • 好吧,它要么写入 -1 作为结果,要么崩溃。不知道怎么办
【解决方案2】:

对于 String 传递,您可以将接收类意图更改为读取 String Extra 并添加空包检查。错误日志将有助于查明问题。也许数据没有以某种方式正确保存......

Bundle bdlExtra = getIntent().getExtras();
if(bdlExtra != null) {
String akylux_extra =bdlExtra.getString("akylux");
}

【讨论】:

    【解决方案3】:

    如果它正在处理一个活动,那么下一个活动应该不会有问题,除非您特别显示您的日志 显示的错误,否则我们无法确定>,除了在 Intents 中放额外的东西,你为什么不使用:

    将是共享原始数据类型以供您整个应用使用的绝佳方式。

    干杯。

    【讨论】:

    • 嗨,首先,感谢您的快速回答,但我已经尝试使用共享偏好,但无法使其工作,看起来我使用它时没有任何反应.这会是一个更好的解决方案吗?谢谢
    • 根据日志,显然最后的activity有一个nullpointerexception
    • 太好了,所以现在我们知道最终的 Activity 没有收到任何东西,添加对 null 的检查,您可以有一个静态引用,以便对象/值引用留在内存中注意:公共静态最终字符串EXTRA_MESSAGE =“com.example.myfirstapp.MESSAGE”;教程:developer.android.com/training/basics/firstapp/building-ui.html 如果我的回答/回复有帮助/有用,请加薪。干杯。
    【解决方案4】:

    我认为您可以使用静态变量或函数将类用作处理程序或控制器:

        class Handler{
             //value
             public static Double result = 0.0;
             //set of values
             public static List<Double> resultArr = new ArrayList<>();
            }
    

    然后您可以从任何其他类传递值并在最终活动中测试这些值,特别是如果您处于多线程数据处理中。 希望帮助:)

    【讨论】:

      【解决方案5】:

      有很多方法可以做。 在你的第一个活动中。 MyFirstActivity.java

       String password="password";
       String mypassword="sfsdf234234";
       Intent myintent = new Intent(MyFirstActivity.this,MySecondActivity.class); 
       myintent,putExtra("Email","rohit@gmail.com"); 
       myintent.putExtra(password,mypassword); 
       startActivity(myintent);
      

      现在从您的第二个活动开始。 MySecondActivity.java 可以通过这种方式获取数据。

      Intent myintent = getIntent();
      String myPassword =myintent.getExtra("password"); 
      String myEmail =myintent.getEXtra("email");
      

      希望这对您有所帮助。 You can also check this post. Same concept.

      【讨论】:

        猜你喜欢
        • 2011-10-06
        • 1970-01-01
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-19
        • 2014-12-08
        相关资源
        最近更新 更多