0

我在第一个活动中调用第二个活动值,但它没有显示。告诉我为什么?如果我在第一个活动中声明公共静态字符串并在第二个活动中调用显示完美但是如果我在第二个活动中声明公共静态字符串值并且在第一个活动中调用显示为 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>
4

5 回答 5

2

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

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

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

于 2012-11-15T07:15:01.500 回答
2

不要这样做!这是非常糟糕的做法。

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

除非绝对必要,否则您不应该从 Activity 中传递任何东西。经验法则是,生命周期大于活动的任何内容都不应引用该活动中的任何内容。这就是为什么 Android 有 Intents 用于活动之间的进程间通信。

由于静态在 Activity A 中声明,然后在 Activity B 中被引用,因此 Activity B 现在处于前台。Android 可以销毁 Activity A。如果确实如此,那么您只是泄露了整个 Activity 以及它也有引用的所有资源。

有几种解决方案,但对我来说,正确的答案是重新考虑你的设计。为什么一项活动需要直接访问另一项活动中的任何内容?我确信有一些非常奇怪的设计可能会暗示这一点,但我想不出任何合理的解释来说明这样做是“正常”的 Android 开发。

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

  • 如果字符串的值是可变的,则在具有 Intent 的捆绑包中的活动之间传递字符串的值。评价 - 非常好。
  • 如果字符串是固定的,把它放到strings.xml中。评价 - 非常好。
  • 如果它真的是全球性的(并且认真思考),那么扩展您的 Application 类。评级 - 我开始闻到一些东西
  • 使用静态字符串创建一个单独的类。评级 - 在键盘上玩了一整天后,闻起来比我的脚更难闻。

请停下来想一想。还请编辑您的问题以解释您要做什么以及为什么要这样做。

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

[编辑] 对于可能的未来读者来说,不仅仅是这个特定问题的部分答案。

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

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

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

现在想象一下,我告诉过你应用程序之外的东西可以通过取消引用它并允许垃圾收集器收集它使用的内存来破坏该对象。垃圾收集器检查对象并看到它被取消引用。但是等一下,有一个静态类级别字段,另一个对象引用了该字段。由于静态必须在类级别,无论是作为变量还是作为静态方法,垃圾收集器不会释放该对象。您现在有一个对象位于您的堆上,它使用的所有内存都无法再引用。

你还会认为以上是一个安全的解决方案吗?

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

于 2012-11-15T07:20:20.287 回答
0

不要使用静态字段在活动之间共享数据。静态字段只有在它们的类被 JVM 加载时才会存在,Android 对此不做任何保证。正确的做法是将数据放入Intent中。请阅读意图指南。

于 2012-11-15T07:13:26.607 回答
0

添加onResume()方法,ButtonExample因为当您的应用程序恢复或用户按下 textview 上的后退按钮时调用此方法

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

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

于 2012-11-15T07:13:52.050 回答
0

Android 已经有了通过方法 startActivityForResult() 将一个活动中的值获取到另一个活动的方法。这个链接可以指导你。

于 2012-11-15T07:21:49.190 回答