我正在开发一个应用程序,在我的主要活动中,有一个标签主机和一个编辑文本字段。选项卡主机将在更改选项卡时在每个选项卡内加载不同的活在每个选项卡中加载的每个活动中,我都放置了一个按钮。当我单击按钮时,我需要在主活动的编辑文本中显示一些文本。但是当我尝试初始化除主活动之外的其他活动中的编辑文本字段时,我将“app forced closed”。
因此,如果有人可以帮助我从选项卡中加载的活动按钮中获取编辑文本获取值,那将是一个很好的帮助
这是截屏 蓝色框将是每个标签中加载的活动,其中将是主要活动
当强制关闭发生时,这就是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 Code
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行, 如果我删除这些行,应用程序将在启动时强制关闭。 如果你想我也可以分享布局
答案 0 :(得分: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);
}
答案 1 :(得分:1)
为什么不将编辑文本实例mainText传递到Regular活动中,然后更新它?
如果你感到困惑,请打我。
<强>更新强> 试试这个,告诉我它是否有效:
在MainActivity
,
int id = mainText.getId();
intent.putExtra("tv", id );
和您的Regular
活动。
//in onCreate
int id = getIntent().getExtras().getInt("tv");
EditText mainText=(EditText) findViewById(id);
这是未经测试的代码,请尝试查看它是否有效。打结我的结果!
答案 2 :(得分:0)
在Tab Host java文件中, 插入以下代码。
View MainActivityView=(LinearLayout)findViewById(R.layout.activity_main);
EditText et=(EditText)MainActivityView.findViewById(R.id.maintext);
您将获得空指针异常,因为edittext框不在选项卡主机视图中..