2012-04-16 98 views
0

因此,我基本上是用某種登錄表單來欺騙,並試圖在即將到來的活動中與用戶名稱說出自定義的問候語。該代碼編譯沒有問題,但應用程序崩潰,只要我點擊登錄按鈕,登錄工作成功之前,我試圖實現自定義你好,所以問題必須在下面的代碼中的某個地方。在活動之間發送數據時發生崩潰

這裏就是我所說的活動:

Intent k = new Intent(this, MainActivity.class); 
      //Sends login name to activity k 
      k.putExtra("loginName", login.getText().toString()); 
//login is the EditText variable name for the login text field 
      startActivity(k); 

這裏就是我檢索額外的數據,並嘗試使用它作爲描述:

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class ProfileActivity extends Activity { 

    TextView helloString; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.home); 
     Bundle extras = getIntent().getExtras(); 

     //Getting the hello text string 
     helloString = (TextView)findViewById(R.id.textHello); 
     String loginName = extras.getString("loginName"); 
     helloString.setText("¡Hello, " + loginName + "!"); 

    } 

} 

這在某種程度上避免了崩潰,如果我把在評論這兩行:

String loginName = extras.getString("loginName"); 
helloString.setText("¡Hello, " + loginName + "!"); 

不過,我不能確定問題是否真的存在或不存在,我thoug它可能與第一個活動發送的數據類型與第二個活動的類型不匹配,但在嘗試了一些東西后仍然沒有任何線索。

在此先感謝。

編輯:

我居然發現我可能有一些做的事實,我打電話給mainActivity.class而被稱爲profileActivity.class活動所顯示的文字,問題是, profileActivity被顯示爲mainActivity中的一個標籤,所以我不知道該如何處理。

編輯2:

所以我解決它終於自己,爲任何有興趣我剛剛發送的數據到MainActivity.class

Intent k = new Intent(this, MainActivity.class); 

      //Sends login name to activity k 
      k.putExtra("loginName", login.getText().toString()); 
      startActivity(k); 

而且,主要活動中,調用ProfileActivity時將其設置爲一個標籤:

//Profile tab 
      intent = new Intent(this, ProfileActivity.class); 
      Bundle extras = getIntent().getExtras(); 
      intent.putExtra("loginName", extras.getString("loginName")); 
      spec = mTabHost.newTabSpec("home") 
        .setIndicator("Home", res.getDrawable(R.drawable.profile_icon)) 
        .setContent(intent); 
      mTabHost.addTab(spec); 

問題解決了,感謝無論如何幫助大家。

+1

檢查logcat並將其發佈到此處,它會告訴你崩潰的原因。 – Jems 2012-04-16 19:20:23

+0

您正在將數據發送到MainActivity,但您正在閱讀ProfileActivity中的意圖數據。您確定這一點? – 2012-04-16 19:22:56

+0

是的,我剛剛編輯了評論,我想這是問題,但由於ProfileActivity作爲一個選項卡在MainActivity內部,我現在不知道如何處理它,我承認在發佈之前我沒有看到它所以我想現在我們已經走了一步。 – 2012-04-16 19:26:45

回答

1

您的意圖是引用MainACtivity.class,並且您正試圖在ProfileActivity中獲取額外的內容。嘗試將MainActivity.class更改爲ProfileActivity.class,如果這是您的流程。請交叉檢查您的活動流程。

希望它有幫助。

Intent k = new Intent(this, ProfileActivity.class); 
      //Sends login name to activity k 
      k.putExtra("loginName", login.getText().toString()); 
//login is the EditText variable name for the login text field 
      startActivity(k); 
+0

是的,這種方式可行,但不打開我想要打開的活動。事情是我需要將數據發送到ProfileActivity,同時仍然打開MainActivity,因爲ProfileActivity作爲選項卡顯示在MainActivity內部。 – 2012-04-16 19:33:43

0

既然你說你想要發送到ProfileActivity數據,但需要打開MainActivity,你可以遵循的4種方法之一。

注意:您應該檢查何時使用getExtra,返回的值不爲null,並對其進行相應處理。

  1. 首先將數據發送到在MainActivity,然後當你從MainActivity推出ProfileActivity,發送先前傳入的數據。
  2. 將數據放在一個公共的靜態字段ProfileActivity。公共靜態變量可能會導致問題,所以我建議不要這樣做。
  3. 將數據保存到sharedPreferences文件並在ProfileActivity中需要時讀取它。
  4. 子類應用程序,您可以在其中設置/訪問許多變量。下面的代碼複製自Are static fields in Activity classes guaranteed to outlive a create/destroy cycle?

    public class MyApplication extends Application {0}私有String事件= null;

    public String getThing(){ 
         return thing; 
        } 
    
        public void setThing(String thing){ 
         this.thing = thing; 
        } 
    } 
    
    public class MyActivity extends Activity { 
        private MyApplication app; 
    
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
    
         app = ((MyApplication)getApplication()); 
    
         String thing = app.getThing(); 
        } 
    } 
    
0

在MainActivity:

String user = this.getIntent().getStringExtra("loginName"); 

而且當你創建MainActivity的tabhost傳遞字符串以同樣的方式:

Intent intent = new Intent().setClass(this, ProfileActivity.class); 
intent.putExtra("loginName", user); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
// Initialize a TabSpec for each tab and add it to the TabHost 
spec = mTabHost.newTabSpec("profile").setIndicator("Profile").setContent(intent); 
mTabHost.addTab(spec); 

這樣的事情。

但是,如果您需要跨整個應用程序的用戶名,請使用輔助類來存儲用戶名。