已解决
我已经解决了这个错误。这与原来的问题无关,而是与调试我的代码有关,我只是在一些变量上出现了一些问题。
最初的问题我有一个 EditText
附带一个 listener
当值发生变化时触发一些方法(它的工作原理)。
活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
}
private void initUI() {
editText = (EditText) findViewById(R.id.et_view);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(final Editable query) {
if (!query.toString().isEmpty())
// Trigger methods
else
myFragment.emptyListView();
}
});
}
片段
private void emptyListView() {
String[] aux = new String[names.size()];
names.toArray(aux);
adapter = new ArrayAdapter<>(m_activity, R.layout.row, aux);
if (m_activity.findViewById(R.id.listView) != null) {
listView.setAdapter(adapter);
}
}
该方法有效,而且它做了应该做的事情。然而,当我改变设备的方向时,活动被重新创建,并且由于任何我不理解的原因,事件 afterTextChanged()
被触发(我不改变它的文本,甚至在重置变化时也不改变,因为我目前只是在运行应用程序,并切换方向),并调用了 emptyListView()
而我得到以下错误。
ERROR
对不起,我把整个消息复制过来,但有些用户在问。
EAndroidRuntime。FATAL EXCEPTION: main java.lang.NullPointerException: 试图在空对象引用上调用虚拟方法'void android.widget.ListView.setVisibility(int)',在myFragment.resetListElements(MyFragment.java:930) 在Activity$1.afterTextChanged(MainActivity.java:226) 在android.widget.TextView.sendAfterTextChanged(TextView.java:10551) 在android. widget.TextView.setText(TextView.java:6278) at android.widget.TextView.setText(TextView.java:6097) at android.widget.EditText.setText(EditText. java:122) at android.widget.TextView.setText(TextView.java:6049) at android.widget.TextView.onRestoreInstanceState(TextView.java:5916) at android.view.View.onRestoreInstanceState(TextView.java:5916) at android.view.View.onRestoreInstanceState(TextView.java:5916) dispatchRestoreInstanceState(View.java:19815) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) 在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) 在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) 在android.view.View.restoreHierarchyState(View.java:19793) 在com.android.internal.policy.PhoneWindow.restoreHierarchyState(View.java:19793) 在android.view.View.view.revierarchyState(View.java:19793) 在android.view.View.View.revierarchyState(View.java:19793) 在com.android.internal.policy. 在 com.android.internal.policy.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2158) at android.app.Activity.onRestoreInstanceState(Activity.java:1563) at android.app.Activity.executeRestoreInstanceState(Activity.java:1518) at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1346) at android. app.ActivityThread.handleStartActivity(ActivityThread.java:3310) at android.app.servertransaction.TransactionExecutor.executor执行LifecycleSequence(TransactionExecutor.java:221) at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) at android.app.servertransaction.TransactionExecutor.executor执行LifecycleSequence(TransactionExecutor.java:221) at android.app.servertransaction.TransactionExecutor.CycleToPath(TransactionExecutor.java:201) TransactionExecutor.executor.executeLifecycleState(TransactionExecutor.java:173) at android.app.servertransaction.TransactionExecutor.executor(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android. os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
我想问题是,调用这个方法和这个 listView
还不存在(或可见性被 "消失")。
您可以检查一下,我已经添加了以下内容 if (m_activity.findViewById(R.id.listView) != null)
来尝试避免调用这个方法,但视图似乎是存在的。我也试过使用 m_activity.findViewById(R.id.listView).getVisibility() == View.VISIBLE
但错误一直存在。
知道为什么这个方法 afterTextChanged()
触发?注
请注意,我希望我的活动在LandscapePortrait时有两种不同的布局,因此我没有在manifest文件中为我的活动添加 "方位"。
EDIT
我试过在 onDestroy()
但这并不能解决这个问题
当你改变设备的方向时,你的活动会被完全重新创建。为了解决这个问题,你需要注意维护状态。https:/developer.android.comtopiclibrariesarchitecturesaving-states。
或向 activity
在 AndroidManifest.xml
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|uiMode"
你可以在这里阅读更多。https:/developer.android.comguidetopicsresourcesruntime-changes。