【问题标题】:how to call 2nd activity value in 1st activity?如何在第一个活动中调用第二个活动值?
【发布时间】:2012-11-15 07:09:56
【问题描述】:

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

【问题讨论】:

  • 这个值 t3.setText(""+Latitude500);不显示显示空

标签: android


【解决方案1】:

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

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

在第一个活动中打印此值。你就知道了

【讨论】:

  • 是的,它的工作,但问题是我在实际代码 8 在第二个活动中编辑 textview,我在 xml 文件上定义文本,如 像这 8 个文本框我想调用第一个活动中的所有值,我该怎么办?
【解决方案2】:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 我想在第一个活动文本视图中显示第二个活动 8 编辑文本值,我该怎么办?
  • 创建一个字符串数组。将 8 个值放入其中。创建一个捆绑包。将数组添加到捆绑包中并将其添加到您的意图中。 bundle.putStringArray()
  • 恕我直言,如果这对您来说很难,那么您需要阅读一些 Android 教程。如果我只是给你代码,那么你学到了什么?如果您坚持绕过学习步骤,那么我相信 Google 搜索会显示数千个示例。
  • 安卓真的能做到吗?除了杀死整个应用程序之外,还专门杀死活动。
  • @mango 从这里developer.android.com/reference/android/app/Activity.html 如果一个活动被暂停或停止,系统可以通过要求它完成或简单地终止其进程来从内存中删除该活动。当它再次显示给用户时,必须完全重新启动并恢复到之前的状态。
【解决方案3】:

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

【讨论】:

  • 但我想在第一个活动中显示第二个活动值
【解决方案4】:

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

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

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

【讨论】:

  • 假设我当时没有按下按钮?我如何在第一个活动中获得第二个活动的价值???
  • @HayyaAnam :当当前活动失去用户的焦点时,无论如何都会出现任何呼叫,或者用户按下主页或后退按钮或出现任何对话框,如果您的应用程序没有被系统杀死,onresume 总是会被调用。因此,如果您想在 Activity 1 或 2 中更新 textview,则必须实现 Activity.thanks 的 onresume 方法
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多