1

2つのアクティビティで構成されるシンプルなアプリを作成しようとしています。最初のアクティビティには2ButtonsEditTextフィールドがあります。(最初のアクティビティで)フィールドsave&moveに入力されたテキストを開いて表示することになっている2番目のアクティビティを押すと。EditTextボタンを押すjust moveと、2番目のアクティビティがロードされます(何もしません)。何らかの理由で、両方のボタンを押しても何も起こりません。

*ボタンの名前があまり明確でない場合は申し訳ありません。前もって感謝します!

最初のアクティビティのコードは次のとおりです。

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

2番目のアクティビティのコードは次のとおりです。

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、クラッシュからのログキャット:

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
4

4 に答える 4

2

ボタンにonClickListenerを設定していません。

すなわち

MainActivity これをonCreateメソッドに追加します。

 nextBT.setOnClickListener(this);
nextPref.setOnClickListener(this);
于 2013-03-23T21:59:34.413 に答える
1

1つは、ボタンのクリックリスナーを設定していないことです。追加:

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

2つの場合、switch-case構文が間違っています。ケースブロックにはブラケットは必要ありません。試す:

    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;

    }
于 2013-03-23T22:02:41.583 に答える
1

明確にするために、私は議論され、結論付けられたものを要約しようとします:

1)最初の問題(ボタンが反応しなかった)は、リスナーを登録しなかったために発生しました。ウィジェット(ボタン、テキストビューなど)がデフォルト以外の方法で反応するためには、その反応を担当するリスナーを登録する必要があります。この場合の解決策は、次の2行のコードを下部に追加することですOnCreate

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

2)2番目の問題(ユーザーがjust moveボタンを押すとアプリがクラッシュする)はOtherクラスで発生します。次の行では、ユーザーがボタンをMainActivity押すと実行されることがわかります。save&move

intent.putExtra("Intent_Data", data);

ただし、ユーザーがjust moveボタンを押した場合、対応するアクションは実行されません。Intent_Dataその結果、押されたボタンによっては、インテントに値が付加される場合と、付加されない場合があります。ではチェックが実行されないため、値(つまり)があるOtherかどうかを確認するために、ボタンを押すたびにNullPointerExceptionが発生します。この問題にはいくつかの簡単な解決策があります。たとえば、前述のチェックを追加できます。ただし、最善の解決策は、意図の一貫性を保ち、メソッドを次のように書き直すことです。Intent_DatagetIntent().getExtras().getString("Intent_Data") != nulljust moveonClick

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")。同じことをしますが、より短く、より効率的です。

于 2013-03-25T08:57:13.587 に答える
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");

  }
于 2014-02-06T12:35:46.620 に答える