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

时间:2012-11-15 07:09:57

标签: android

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

5 个答案:

答案 0 :(得分:2)

这是因为,在第2个活动中为字符串赋值之前,您正在读取第一个活动。所以它是null。

在第二个活动public static String Check="check"

中声明如下

在第1个活动中打印此值。你来了解这个

答案 1 :(得分:2)

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

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

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

由于静态在活动A中声明,然后在活动B中引用,因此活动B现在位于前台。 Android可以销毁活动A.如果确实如此,那么你刚刚泄露了整个活动及其所有资源。

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

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

  • 如果字符串的值是可变的,则使用Intent传递包中活动之间的字符串值。评级 - 非常好。
  • 如果字符串已修复,请将其放入strings.xml中。评级 - 非常好。
  • 如果它真的是全局的(并且认真考虑那个),那么扩展你的Application类。评级 - 我开始闻到一些东西
  • 使用静态字符串创建单独的类。评分 - 在键盘上度过漫长的一天后,闻起来比我的脚更糟糕。

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

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

[编辑]更多可能的未来读者,而不是这个具体问题的部分答案。

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

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

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

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

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

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

答案 2 :(得分:0)

不要使用静态字段在活动之间共享数据。静态字段仅在JVM加载它们的类时才存在,Android不保证这一点。正确的方法是将数据放在Intent中。请阅读Intents指南。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

Android已经有了通过methode startActivityForResult()将一个活动中的值传递给另一个活动的方法。这个link可以指导您。