0

私はアプリを開発しています。メインのアクティビティには、タブホストと編集テキストフィールドがあります。タブホストは、タブを変更するときに各タブ内に異なるアクティビティをロードします。各タブに読み込まれる各アクティビティに、ボタンを配置しました。ボタンをクリックすると、メインアクティビティの編集テキストにテキストを表示する必要があります。しかし、メインアクティビティ以外のアクティビティで編集テキストフィールドを初期化しようとすると、「アプリが強制的に閉じられます」というメッセージが表示されます。

したがって、誰かが私が編集テキストを取得するのを手伝ってくれるなら、タブにロードされたアクティビティのボタンからボタンを押すことで価値を得ることができれば、それは大きな助けになります

これはスクリーンショットの青いボックスで、すべてのタブに読み込まれるアクティビティになり、そのうちのメインアクティビティになります

私のアプリのスクリーンショット

これは、強制終了が発生したときのLogcat出力の外観です。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.batz.voiceforyou/com.batz.voiceforyou.Things}: java.lang.NullPointerException
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2065)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.app.ActivityThread.startActivityNow(ActivityThread.java:1906)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:694)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.widget.TabHost.setCurrentTab(TabHost.java:358)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:553)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.view.View.performClick(View.java:4129)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.view.View$PerformClick.run(View.java:17143)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.os.Handler.handleCallback(Handler.java:615)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.os.Looper.loop(Looper.java:137)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.app.ActivityThread.main(ActivityThread.java:4802)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at java.lang.reflect.Method.invokeNative(Native Method)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at java.lang.reflect.Method.invoke(Method.java:511)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:813)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:580)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at dalvik.system.NativeStart.main(Native Method)
03-24 17:55:23.928: E/AndroidRuntime(23581): Caused by: java.lang.NullPointerException
03-24 17:55:23.928: E/AndroidRuntime(23581):    at com.batz.voiceforyou.Things.onCreate(Things.java:19)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.app.Activity.performCreate(Activity.java:5013)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
03-24 17:55:23.928: E/AndroidRuntime(23581):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2029)
03-24 17:55:23.928: E/AndroidRuntime(23581):    ... 18 more  

これがMainActivityコードです

public class MainActivity extends TabActivity {

String text="";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);




    final EditText mainText=(EditText) findViewById(R.id.maintext);


    Resources res =  getResources();
    TabHost tabs =  getTabHost();

    Intent regular =  new Intent(this, Regular.class);
    TabSpec reg =  tabs.newTabSpec("Regular")
            .setIndicator("", res.getDrawable(R.drawable.ic_launcher))
            .setContent(regular);

    Intent things =  new Intent(this, Things.class);
    TabSpec thngs =  tabs.newTabSpec("Things")
            .setIndicator("", res.getDrawable(R.drawable.ic_launcher))
            .setContent(things);

    tabs.addTab(reg);
    tabs.addTab(thngs);

    tabs.setCurrentTab(0);

}


}

これは、タブ内に読み込まれるアクティビティの1つです

public class Regular extends Activity {
String text="";
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.regular);


    //final EditText mainText=(EditText) findViewById(R.id.maintext);
    //text=mainText.getText().toString();

    Button regbtn =  (Button) findViewById(R.id.regularbutton);
    regbtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            text=text+" regular";
            //mainText.setText(text);
        }
    });

}

}

ここに私がコメントした3行が表示されます。これらの行を削除すると、アプリは起動時に強制的に閉じます。必要に応じて、レイアウトも共有できます

4

3 に答える 3

2

これは、ブロードキャストを送信することにより、既存の設定で実現できます。

まず、MainActivityに次のようにBroadcastReceiverを作成します。

public static final String ACTION_UPDATE_TEXT = "com.batz.voiceforyou.UPDATE_TEXT";
public static final String EXTRA_TEXT = "text";

private BroadcastReceiver textReceiver = new  BroadcastReceiver() {

    @Override
    public void onReceive(Context context, final Intent intent) {
        if (intent != null && ACTION_UPDATE_TEXT.equals(intent.getAction())) {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    String text = intent.getStringExtra(EXTRA_TEXT);
                    EditText mainText=(EditText) findViewById(R.id.maintext);
                    mainText.setText(text);
                }
            });
        }
    }
};

次に、MainActivityのonResume()メソッドにレシーバーを登録します。

registerReceiver(textReceiver, new IntentFilter(ACTION_UPDATE_TEXT));

onPause()メソッドで登録を解除することを忘れないでください。

unregisterReceiver(textReceiver);

次に、クリックハンドラーの各アクティビティ(通常および事物)ボタンで、次のようにブロードキャストを送信します。

    @Override
    public void onClick(View v) {
        //your other code

        Intent intent = new Intent(MainActivity.ACTION_UPDATE_TEXT);
        intent.putExtra(MainActivity.EXTRA_TEXT, text);
        sendBroadcast(intent);
    }
于 2013-04-01T17:24:01.477 に答える
1

テキスト編集インスタンスmainTextを通常のアクティビティに渡して、それを更新してみませんか?

あなたが混乱しているなら私を殴ってください。

更新 これを試して、それが機能するかどうか教えてください:

あなたのMainActivity中で、

int id = mainText.getId();

intent.putExtra("tv", id );

とあなたのRegular活動で。

//in onCreate
int id = getIntent().getExtras().getInt("tv");

EditText mainText=(EditText) findViewById(id);

これはテストされていないコードです。動作するかどうか試してみてください。結果で私を襲ってください!

于 2013-03-31T07:15:06.753 に答える
0

タブホストJavaファイルに、次のコードを挿入します。

View MainActivityView=(LinearLayout)findViewById(R.layout.activity_main);
EditText et=(EditText)MainActivityView.findViewById(R.id.maintext);

edittextボックスがタブホストビューにないため、nullポインタ例外が発生します。

于 2013-03-24T13:13:16.277 に答える