2013-03-23 52 views
1

我試圖構建一個由兩個活動組成的簡單應用程序。第一項活動有2 ButtonsEditText字段。當按下save&move時,應該打開第二個活動並顯示在EditText字段中輸入的文本(在第一個活動中)。按just move按鈕時,應該加載第二個活動(而不是執行任何操作)。出於某種原因什麼也沒有發生當兩個按鈕被按下時。在intents之間移動,Android Android

*對不起,如果按鈕的名稱不是很清楚。提前致謝!

下面有第一活動的代碼:

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends Activity implements OnClickListener 
{ 

    private Button nextBT; 
    private EditText mainEditText; 
    private String data; 
    private Button nextPref; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     nextBT=(Button)findViewById(R.id.nextButton); 
     mainEditText=(EditText)findViewById(R.id.dataEditText); 
     nextPref=(Button)findViewById(R.id.nextPrefBut);   
    } 

    public void onClick(View v) 
    { 
     int id = v.getId(); 

     switch(id) 
     { 
      case R.id.nextButton: 
      { 
       data=mainEditText.getText().toString(); 
       if(!(data.equals("")) && (data!=null)) 
       { 
        Intent intent = new Intent(MainActivity.this,Other.class); 
        intent.putExtra("Intent_Data", data); 
        startActivity(intent); 
       } 
       else 
       { 
        Toast.makeText(getApplicationContext(), "no data to pass", Toast.LENGTH_SHORT).show(); 
       } 
       break; 
      } 
      case R.id.nextPrefBut: 
      { 
       startActivity(new Intent(MainActivity.this, Other.class)); 
       break; 
      } 
     } 
    } 
} 

下面有第二活動的代碼:

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

public class Other extends Activity 
{ 
    private TextView textFromMain; 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_other); 
     textFromMain = (TextView)findViewById(R.id.mainText); 
     textFromMain.setText(getIntent().getExtras().getString("Intent_Data")); 

    } 
} 

編輯:

感謝您的答覆。新問題,應用程序崩潰,如果just move被按下,有什麼想法?第一個按鈕save&move工作得很好。

編輯#2,從崩潰的logcat的:

03-24 12:50:14.135: I/ActivityManager(289): START u0 {cmp=com.example.c/.Other} from pid 851 
03-24 12:50:14.314: D/dalvikvm(289): GC_FOR_ALLOC freed 980K, 20% free 8310K/10384K, paused 99ms, total 113ms 
03-24 12:50:14.584: D/AndroidRuntime(851): Shutting down VM 
03-24 12:50:14.584: W/dalvikvm(851): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
03-24 12:50:14.625: E/AndroidRuntime(851): FATAL EXCEPTION: main 
03-24 12:50:14.625: E/AndroidRuntime(851): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.c/com.example.c.Other}: java.lang.NullPointerException 
03-24 12:50:14.625: E/AndroidRuntime(851): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
03-24 12:50:14.625: E/AndroidRuntime(851): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
03-24 12:50:14.625: E/AndroidRuntime(851): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
03-24 12:50:14.625: E/AndroidRuntime(851): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
03-24 12:50:14.625: E/AndroidRuntime(851): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-24 12:50:14.625: E/AndroidRuntime(851): at android.os.Looper.loop(Looper.java:137) 
03-24 12:50:14.625: E/AndroidRuntime(851): at android.app.ActivityThread.main(ActivityThread.java:5041) 
03-24 12:50:14.625: E/AndroidRuntime(851): at java.lang.reflect.Method.invokeNative(Native Method) 
03-24 12:50:14.625: E/AndroidRuntime(851): at java.lang.reflect.Method.invoke(Method.java:511) 
03-24 12:50:14.625: E/AndroidRuntime(851): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-24 12:50:14.625: E/AndroidRuntime(851): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-24 12:50:14.625: E/AndroidRuntime(851): at dalvik.system.NativeStart.main(Native Method) 
03-24 12:50:14.625: E/AndroidRuntime(851): Caused by: java.lang.NullPointerException 
03-24 12:50:14.625: E/AndroidRuntime(851): at com.example.c.Other.onCreate(Other.java:16) 
03-24 12:50:14.625: E/AndroidRuntime(851): at android.app.Activity.performCreate(Activity.java:5104) 
03-24 12:50:14.625: E/AndroidRuntime(851): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
03-24 12:50:14.625: E/AndroidRuntime(851): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
03-24 12:50:14.625: E/AndroidRuntime(851): ... 11 more 
03-24 12:50:14.664: W/ActivityManager(289): Force finishing activity com.example.c/.Other 
03-24 12:50:14.703: W/ActivityManager(289): Force finishing activity com.example.c/.MainActivity 
03-24 12:50:14.974: E/SurfaceFlinger(36): ro.sf.lcd_density must be defined as a build property 
03-24 12:50:15.216: W/ActivityManager(289): Activity pause timeout for ActivityRecord{4112d850 u0 com.example.c/.Other} 
03-24 12:50:15.623: E/SurfaceFlinger(36): ro.sf.lcd_density must be defined as a build property 
03-24 12:50:15.643: W/EGL_emulation(413): eglSurfaceAttrib not implemented 
03-24 12:50:16.443: E/SurfaceFlinger(36): GL error 0x0505 
03-24 12:50:16.643: E/SurfaceFlinger(36): GL error 0x0505 
03-24 12:50:16.753: I/Process(851): Sending signal. PID: 851 SIG: 9 
03-24 12:50:16.773: I/WindowState(289): WIN DEATH: Window{41134870 u0 com.example.c/com.example.c.MainActivity} 
03-24 12:50:16.786: I/ActivityManager(289): Process com.example.c (pid 851) has died. 
03-24 12:50:16.943: W/InputMethodManagerService(289): Got RemoteException sending setActive(false) notification to pid 851 uid 10052 
03-24 12:50:17.156: E/SurfaceFlinger(36): GL error 0x0505 
03-24 12:50:17.233: E/SurfaceFlinger(36): GL error 0x0505 
03-24 12:50:17.366: E/SurfaceFlinger(36): GL error 0x0505 
03-24 12:50:46.890: D/ExchangeService(658): Received deviceId from Email app: null 

回答

1

爲清楚起見,我會試着總結一下討論,並得出結論:

1)(按鈕是非反應性)的,因爲他們沒有登記任何聽衆造成初始發行。爲了使任何小部件(按鈕,文本視圖等)以某種非默認的方式作出反應,它必須註冊一個監聽器,這將對該反應負責。在這種情況下,溶液將簡單地是下面的代碼兩行的OnCreate底部添加:當用戶按下just move按鈕

nextBT.setOnClickListener(this); 
nextPref.setOnClickListener(this); 

2)第二個問題(應用崩潰)發生在Other類。我們看到,在MainActivity當用戶按下按鈕save&move執行以下行:

intent.putExtra("Intent_Data", data); 

然而,當用戶按下按鈕just move沒有執行相應的動作。其結果是,有時意圖的價值將附加到Intent_Data鍵,有時它不會,這取決於按下哪個按鈕。由於Other中沒有執行檢查,因此若要查看Intent_Data是否有值(即getIntent().getExtras().getString("Intent_Data") != null),則每次按下just move按鈕時都會收到NullPointerException。這個問題有許多簡單的解決方案。例如,您可以添加提到的檢查。最好的解決辦法,但是,這是保持一致的意圖,只是重寫onClick方法如下:

public void onClick(View v) 
{ 
    String data = mainEditText.getText().toString(); 
    if(v.getId() == R.id.nextButton && data.equals("")) { 
     Toast.makeText(getApplicationContext(), "no data to pass", Toast.LENGTH_SHORT).show(); 
    } 
    else { 
     Intent intent = new Intent(MainActivity.this,Other.class); 
     intent.putExtra("Intent_Data", data); 
     startActivity(intent); 
    } 
} 

而且,考慮使用功能:getStringExtra("Intent_Data")而不是使用的:getExtras().getString("Intent_Data")。它做同樣的事情,但它更短,更高效。

+0

感謝您的意見,將保持你的東西記住了。順便說一下,我確實提供了'other'活動的代碼,只是在'MainActivity'下面。 – undroid 2013-03-28 11:13:11

+0

對不起。我瀏覽了這個問題,錯過了它。我相應地編輯了我的回覆。 – SomeStrangeUser 2013-03-28 11:54:49

2

您沒有設置onClickListener您的按鈕。

MainActivity onCreate方法添加此。

nextBT.setOnClickListener(this); 
nextPref.setOnClickListener(this); 
1

其中之一,你沒有設置您的按鈕點擊偵聽器。添加:

nextBT.setOnClickListener(this); 
nextPref.setOnClickListener(this); 

對於兩種情況,您的開關盒語法是錯誤的。情況塊不需要括號。嘗試:

switch(id) 
    { 
     case R.id.nextButton: 

      data=mainEditText.getText().toString(); 
      if(!(data.equals("")) && (data!=null)) 
      { 
       Intent intent = new Intent(MainActivity.this,Other.class); 
       intent.putExtra("Intent_Data", data); 
       startActivity(intent); 
      } 
      else 
      { 
       Toast.makeText(getApplicationContext(), "no data to pass", Toast.LENGTH_SHORT).show(); 
      } 
      break; 

     case R.id.nextPrefBut: 

      startActivity(new Intent(MainActivity.this, Other.class)); 
      break; 

    } 
+0

感謝您的闡述回答。但是,做一個活動實現'OnClickListener'類的重點在於編寫更少的代碼並使我的代碼更具可讀性?我的意思是,我的'MainActivity'類實現'OnClickListener',並且覆蓋'OnClick'方法來根據按下的按鈕來操作。爲什麼我必須爲聽衆添加顯式定義? 編輯: – undroid 2013-03-24 07:17:02

+0

編輯: 現在的'按鈕'反應,但應用程序崩潰時,我按'只是移動'。我錯過了什麼? – undroid 2013-03-24 07:55:42

+0

@AlexTal您是否在清單中聲明瞭第二個活動? – 2013-03-24 12:37:46

0

源類:

Intent myIntent = new Intent(this, NewActivity.class); 
    myIntent.putExtra("firstName", "Your First Name Here"); 
    myIntent.putExtra("lastName", "Your Last Name Here"); 
    startActivity(myIntent) 

目的類(NewActivity類):

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.view);  

    Intent intent = getIntent(); 

    String fName = intent.getStringExtra("firstName"); 
    String lName = intent.getStringExtra("lastName"); 

    }