簡體   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