2013-03-23 4 views
1

Im пытается создать простое приложение, состоящее из двух видов деятельности. Первая деятельность имеет 2 Buttons и поле EditText. При нажатии save&move вторая активность должна открываться и показывать текст, который был введен в поле EditText (в первом действии). При нажатии кнопки just move вторая активность должна загружаться (и ничего не делать). По какой-то причине ничего не происходит. при нажатии обеих кнопок.Перемещение между действиями с Intents, Android

* Извините, если названия кнопок не очень четкие. Заранее спасибо!

Heres код первого действия:

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; 
      } 
     } 
    } 
} 

Heres код второй деятельности:

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) Первоначальный выпуск (кнопки были не реагирующие) была вызвана тем, что они не зарегистрировали каких-либо слушателей , Чтобы любой виджет (Button, textview и т. Д.) Реагировал некорректно, он должен зарегистрировать слушателя, который будет отвечать за эту реакцию. Решение в этом случае было бы просто добавить следующие две строки кода в нижней части OnCreate:

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

2) Второй выпуск (приложение падает, когда пользователь нажимает на кнопку just move) происходит в Other классе. Мы видим, что в MainActivity следующая строка выполняется, когда пользователь нажимает на кнопку save&move:

intent.putExtra("Intent_Data", data); 

Однако, не соответствующее действие не выполняется, когда пользователь нажимает на кнопку just move. Результат состоит в том, что иногда у намерения будет значение, прикрепленное к ключу Intent_Data, и иногда оно не зависит, в зависимости от того, какая кнопка нажата.Так как в Other проверка не выполняется, чтобы узнать, имеет ли значение Intent_Data (т. Е. getIntent().getExtras().getString("Intent_Data") != null), вы получите исключение NullPointerException каждый раз, когда вы нажимаете кнопку just move. Существует ряд простых решений этой проблемы. Например, вы можете добавить указанную проверку. Лучшее решение, однако, было бы держать намерение последовательны и просто переписать метод 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

спасибо за вклад, сохранит то, что вы «Имейте в виду. кстати, я представил код для «другой» деятельности, просто подшучивал «MainActivity». – undroid

+0

извините, что. Я просмотрел вопрос и пропустил его. Я отредактировал свой ответ соответственно. – SomeStrangeUser

2

Вы не установили onClickListener для кнопок.

т.е.

Добавить это в MainActivity OnCreate метод.

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

Во-первых, вы не устанавливаете кнопки для прослушивания кнопок. Add:

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' и ive переопределяет метод OnClick, чтобы действовать в соответствии с нажатыми кнопками. Почему я должен добавить явное определение для слушателей? Редактировать: – undroid

+0

Редактировать: Теперь 'Buttons' реагируют, но приложение падает, когда я нажимаю' просто переместить'. Что я упустил? – undroid

+0

@AlexTal Вы объявили вторую активность в своем манифесте? –

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"); 

    } 
Смежные вопросы