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

}


}

这是在选项卡内加载的活动之一

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()方法中注册receiver:

registerReceiver(textReceiver, new IntentFilter(ACTION_UPDATE_TEXT));

不要忘记在 onPause() 方法中取消注册它:

unregisterReceiver(textReceiver);

接下来,在您的每个活动(常规和事物)按钮 onclick 处理程序中,像这样发送广播:

    @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 框不在您的选项卡主机视图中。

于 2013-03-24T13:13:16.277 回答