2012-11-15 127 views
0

我在第一個活動中調用第二個活動值,但它不顯示。告訴我爲什麼? 如果我在第一個活動中聲明瞭公共靜態String並且在第二個活動中調用了完美的演示,但是如果我在第二個活動中聲明瞭公共靜態String值並且在第一個活動中調用了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> 
+0

此值t3.setText(「」+ Latitude500);不顯示顯示空 –

回答

2

它是因爲,在第2個活動中將字符串賦值給第一個活動中的字符串之前。所以它是空的。

聲明這樣在第二個活動public static String Check="check"

打印在1日活動這個值。你知道這個

+0

是它的工作,但問題是我在實際的代碼8編輯textview在第二個活動,我定義的文本在xml文件上,如 android:id =「@ + id/editText1」 android:layout_width =「match_parent」 機器人:layout_height =「WRAP_CONTENT」 機器人:EMS =「10」 機器人:文本=「你好nazeer」> 這樣8文本框我瓦納調用1日活動的所有值,所以我會做什麼? –

0

不要通過使用靜態字段在活動之間共享數據。只要靜態字段的類由JVM加載,並且Android不作任何保證。正確的方法是將數據放入Intent。請閱讀Intents指南。

+0

但我在第一個活動想顯示第二活性值 –

0

ButtonExample添加onResume()方法監守這個方法調用的時候你的機應用GET恢復或用戶按後退按鈕上的TextView

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

和我的選擇是避免使用靜態變量的Application.you可以使用SharedPreferences或用於在應用程序組件之間共享數據的意圖

+0

想我因此未按下按鈕呢?我如何在第一次活動中獲得第二次活動的價值? –

+0

@HayyaAnam:如果當前活動失去了用戶的注意力,就像出現任何呼叫一樣,或者用戶按下home或back按鈕或出現任何dilogbox,如果您的應用程序未被System終止,onresume總是會被調用。所以如果你想在Activity 1st或2nd中更新textview,你必須實現Activity的onresume方法。謝謝 –

2

不要這樣做!這是非常糟糕的做法。

對您的問題的簡單回答是因爲活動2尚未初始化,直到您啓動它。活動與其他任何對象一樣,是Activity類型的對象。關於活動沒有什麼神祕的 - 除非,如果Android不是主動活動,Android保留殺掉它們的權利。

除非絕對必要,否則不應將任何事情從活動中傳出。經驗法則是任何生命週期都不得超過活動的應該引用該活動中的任何內容。這就是爲什麼Android有意圖進行活動間進程間通信的原因。

由於靜態在活動A中聲明,然後在活動B中被引用,活動B現在在前臺。 Android可以銷燬活動A.如果發生這種情況,那麼您已經泄露了整個活動以及它有參考的所有資源。

有幾種解決方案,但對我來說,正確的答案是重新考慮你的設計。爲什麼一項活動需要直接訪問另一項活動中的任何內容?我確信有一些真正奇怪的設計可能會暗示這一點,但我想不出任何合理的解釋,因爲這是「正常的」Android開發。

可能的解決方案,在正確的我個人的優先順序:

  • 如果字符串的值是可變的,通過與意向捆活動之間的字符串的值。評級 - 非常好。
  • 如果字符串是固定的,把它放到strings.xml中。評級 - 非常好。
  • 如果它確實是全球性的(並且認真思考),那麼擴展你的Application類。評分 - 我開始聞到什麼東西
  • 用靜態字符串創建一個單獨的類。評分 - 在鍵盤漫長的一天之後,聞起來比我的腳差。

請停下來思考一下。也請編輯你的問題,解釋你正在做什麼,以及你爲什麼要這樣做。

不要擔心現在的代碼,先找到正確的解決方案,然後擔心代碼。

[編輯]更多可能的未來讀者比這個具體問題的答案的一部分。

想象一下,你創建自己的班級。該類具有包含視圖層次結構的用戶界面。它有一些位圖,使用戶界面看起來不錯,可容納各種數據的引用,例如串填充UI。它也可能有一個適配器連接到一些數據結構。它有一個靜態字段,以便其他對象可以訪問該類實例中的數據。

現在讓我們暫停關於「靜態邪惡」和「全局變量」的討論。

您創建此類的實例並引用其他對象。這一切都很好,到目前爲止,因爲您可以控制對象的生命週期,並能編寫代碼,以確保沒有任何東西可以保留對它的引用,當你想將其釋放。

現在想象一下,我告訴過你,應用程序之外的某些東西可以通過取消引用並允許垃圾收集器收集它使用的內存來銷燬該對象。垃圾收集器檢查對象並看到它被解除引用。但是請等一下,另一個對象有一個靜態類級別字段可供參考。由於靜態必須級水平,無論是作爲一個變量或爲靜態方法中,垃圾收集器將不能釋放該對象。你現在有一個物體坐在你的堆上,它擁有所有你不能再使用的內存。

你還會認爲上述是一個安全的解決方案嗎?

這裏的關鍵是一個活動就是這樣。它是Activity類的一個對象實例。但是,在Android上,對象具有一些特殊的性質,其中之一是,Android的能殺死目標沒有進一步回調到您的代碼。

+0

i wana顯示第二個活動8編輯第一個活動文字瀏覽中的文本值,我該怎麼做? –

+0

創建一個字符串數組。將8個值放入其中。創建一個包。將數組添加到捆綁包並將其添加到您的意圖。 bundle.putStringArray() – Simon

+0

舉例如何? –

0

Android已經有方法通過methode startActivityForResult()將一個活動中的值獲取到另一個活動。這link可以指導你。

相關問題