首页 > 解决方案 > afterTextChanged 切换设备方向时自动触发

问题描述

解决了

我已经解决了这个错误。它与原始问题无关,而是与调试我的代码有关。我只是在某些变量方面遇到了一些问题。

原始问题 我有一个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(),我收到以下错误:

错误

很抱歉复制了整个消息,但有些用户要求它。

E/AndroidRuntime: 致命异常: main java.lang.NullPointerException: 尝试在 Activity 的 myFragment.resetListElements(MyFragment.java:930) 的空对象引用上调用虚拟方法“void android.widget.ListView.setVisibility(int)” $1.afterTextChanged(MainActivity.java:226) 在 android.widget.TextView.sendAfterTextChanged(TextView.java:10551) 在 android.widget.TextView.setText(TextView.java:6278) 在 android.widget.TextView.setText(TextView .java:6097) 在 android.widget.EditText.setText(EditText.java:122) 在 android.widget.TextView.setText(TextView.java:6049) 在 android.widget.TextView.onRestoreInstanceState(TextView.java:5916)在 android.view.View.dispatchRestoreInstanceState(View.java:19815) 在 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.View.restoreHierarchyState(View.java:19793) 在 android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) 在 android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3864) 在 com .android.internal.policy.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2158) 在 android.app.Activity.onRestoreInstanceState(Activity.java:1563) 在 android.app.Activity.performRestoreInstanceState(Activity.java:1518) 在 android。应用程序。仪器。callActivityOnRestoreInstanceState(Instrumentation.java:1346) 在 android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) 在 android.app.servertransaction.TransactionExecutor.cycleToPath (TransactionExecutor.java:201) 在 android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 在 android.app.ActivityThread$H。 handleMessage(ActivityThread.java:2016) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java :第 7356 章ZygoteInit.java:930)

我想问题是正在调用这个方法并且listView还不存在(或者可见性是`GONE)。

如您所见,我已添加该行if (m_activity.findViewById(R.id.listView) != null)以尽量避免调用此方法,但该视图似乎存在。我也尝试过使用m_activity.findViewById(R.id.listView).getVisibility() == View.VISIBLE,但错误仍然存​​在。

关于为什么afterTextChanged()触发此方法的任何想法? 笔记

请注意,我希望在横向/纵向时有两种不同的活动布局,因此我不会在清单文件中的活动中添加“方向”。

编辑

我试过删除观察者,onDestroy()但没有解决

标签: androidnullpointerexceptionlistener

解决方案


当您更改设备的方向时,您的活动将完全重新创建。要解决此问题,您需要注意维护状态https://developer.android.com/topic/libraries/architecture/saving-states

activity或在中添加参数AndroidManifest.xml

android:configChanges="orientation|keyboardHidden|keyboard|screenSize|uiMode"

您可以在这里阅读更多内容:https ://developer.android.com/guide/topics/resources/runtime-changes


推荐阅读