繁体   English   中英

如何在第一个活动中调用第二个活动值?

[英]how to call 2nd activity value in 1st activity?

我在第一个活动中调用第二个活动值,但未显示。 告诉我为什么? 如果我在第一个活动中声明了公共静态字符串,并在第二个活动中调用,则可以很好地显示出来;但是,如果我在第二个活动中声明了公共静态字符串值,并在第一个活动中,调用显示了null,请告诉我为什么?

  import android.widget.EditText;
  import android.widget.TextView;
  import android.widget.Toast;

  public class ButtonExample extends Activity
 {
   Button b1;

  String Latitude500;

 public void onCreate(Bundle savedInstanceState)
{
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);

  b1 = (Button) findViewById(R.id.button1);


 Latitude500=textview.Latitude1nazeer;

 TextView t3 = (TextView) findViewById(R.id.textView2);

t3.setText(""+Latitude500);


 b1.setOnClickListener(new OnClickListener()
 {
 public void onClick(View v)
 {



  Intent intent = new Intent(ButtonExample.this, textview.class);



startActivity(intent);


 }
  });


         public class textview extends Activity {



  public static String Latitude1nazeer;


  EditText Latituden1;

     public void onCreate(Bundle savedInstanceState)
  {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.laymenu);


   Latituden1 = (EditText) findViewById(R.id.editText2);
   String ln = Latituden1.getText().toString();


   Latitude1nazeer=ln;





  }
          }




         <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mypackage"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".ButtonExample"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
     <activity android:name=".textview" > </activity>   
</application>

 </manifest>

这是因为,在第二活动中为字符串赋值之前,您正在第一活动中阅读。 因此为空。

在第2个活动中这样声明: public static String Check="check"

在第一个活动中打印此值。 你开始知道这个

不要这样做! 这确实是不好的做法。

您问题的简单答案是,活动2在启动之前尚未初始化。 活动是活动类型的对象,就像其他任何对象一样。 活动没有什么神秘之处-除非活动不是活动的,否则Android保留杀死它们的权利。

除非绝对必要,否则您不应从活动中传递任何东西。 经验法则是,生命周期大于活动的任何事物都不应引用该活动中的任何事物。 这就是Android在活动之间进行流程间通信的意图的原因。

由于在活动A中声明了一个静态变量,然后在活动B中对其进行了引用,因此活动B现在位于前台。 Android可以销毁ActivityA。如果确实如此,那么您就泄漏了整个活动以及它也具有引用的所有资源。

有几种解决方案,但是对我来说,正确的答案是重新考虑您的设计。 为什么一个活动需要直接访问另一个活动中的任何内容? 我敢肯定有些真正奇怪的设计可能会暗示这一点,但是我无法想到任何合理的解释都是“正常的” Android开发。

可能的解决方案,按照我个人的正确选择顺序:

  • 如果字符串的值是可变的,请使用Intent在捆绑包中的活动之间传递字符串的值。 评分-非常好。
  • 如果字符串是固定的,则将其放入strings.xml。 评分-非常好。
  • 如果它确实是全球性的(并且对此进行认真思考),则扩展您的Application类。 评分-我开始闻到一些气味
  • 用静态字符串创建一个单独的类。 评分-经过一整天的键盘操作后,气味比我的脚还差。

请停下来想一想。 另外,请编辑您的问题,以说明您要做什么以及为什么要这么做。

现在不必担心代码,先找到正确的解决方案,然后再担心代码。

[编辑]对于未来的潜在读者而言,这不仅仅是该特定问题答案的一部分。

假设您创建了自己的课程。 该类具有带视图层次结构的用户界面。 它具有一些位图,可以使UI看起来不错,并且可以保存对各种数据的引用,例如用于填充UI的字符串。 它还可能有一个适配器,可以连接到某些数据结构。 它具有一个静态字段,以便其他对象可以访问此类实例中的数据。

让我们暂时搁置有关“是静态的邪恶”和“全局变量”的讨论。

您创建此类的一个实例,其他对象开始引用它。 到目前为止,这一切都很好,因为您可以控制该对象的生命周期,并且可以编写代码以确保在要释放该对象时没有任何东西可以保留对该对象的引用。

现在想象一下,我告诉您,应用程序外部的某些事物可以通过取消引用对象并允许垃圾收集器收集使用的内存来破坏该对象。 垃圾收集器检查对象,并发现它已被取消引用。 但是请稍等,还有一个静态类级别字段,另一个对象可以引用该字段。 由于静态变量必须在类级别(作为变量或作为静态方法),因此垃圾回收器不会释放该对象。 现在,您将一个对象与所有已使用的内存一起放在堆上,您将无法再使用该内存。

您是否仍然认为上述方法是安全的解决方案?

这里的关键是活动就是这样。 这是Activity类的对象实例。 但是在Android上,对象具有一些特殊的属性,其中之一就是Android可以杀死该对象,而无需进一步调用代码。

不要使用静态字段在活动之间共享数据。 静态字段仅在JVM加载其类的情况下存在,Android对此不做任何保证。 正确的方法是将数据放入Intent中 请阅读意图指南。

ButtonExample添加onResume()方法,因为当您恢复应用或用户在textview上按返回按钮时调用此方法

@Override
public void onResume()
{
    Log.v("Resuming", "onResume");
    t3.setText(""+Latitude500); // set text here
    super.onResume();
}

我的偏好是避免对Application使用静态变量。您可以使用SharedPreferences或Intent在应用程序组件之间共享数据

Android已经有了通过startActivityForResult()方法将一个活动中的值转换为另一个活动中的值的方法。 链接可以指导您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM