在切换设备方向时自动触发afterTextChanged。

问题描述 投票:0回答:1

已解决

我已经解决了这个错误。这与原来的问题无关,而是与调试我的代码有关,我只是在一些变量上出现了一些问题。

最初的问题我有一个 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() 但这并不能解决这个问题

android nullpointerexception listener
1个回答
0
投票

当你改变设备的方向时,你的活动会被完全重新创建。为了解决这个问题,你需要注意保持状态。https:/developer.android.comtopiclibrariesarchitecturesaving-states。

或向 activityAndroidManifest.xml

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

你可以在这里阅读更多。https:/developer.android.comguidetopicsresourcesruntime-changes。

© www.soinside.com 2019 - 2024. All rights reserved.