【问题标题】:EditText cursor bug after dialog close对话框关闭后EditText光标错误
【发布时间】:2018-06-20 12:38:41
【问题描述】:

我遇到了一个问题。不知道该怎么称呼它,或者是什么原因造成的

我正在学习 Android SQLite,并开始制作一个简单的笔记应用程序。

问题是我有一个用于类别选择的自定义对话框,在打开对话框之前 EditText 字段中的一切都很好,但是在打开和关闭它之后,文本开始覆盖,就像创建多个相同文本的图层和文本光标在每个符号后留下一行。 (见问题的“bug demo”GIF)

有没有其他人见过这样的事情?什么可能导致这个对话框?

编辑:

所以这是点击星号打开对话框时采取行动的代码

 starred.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

                AlertDialog.Builder builder = new AlertDialog.Builder(CreateNoteActivity.this);
                View mView = getLayoutInflater().inflate(R.layout.dialog_category_select, null);
                ListView categoryList = mView.findViewById(R.id.category_list);
                Button cancelSelect = mView.findViewById(R.id.cancelSelect);

                final CategoryListAdapter adapter = new CategoryListAdapter(CreateNoteActivity.this);
                categoryList.setAdapter(adapter);
                //get the data and append to a list
                Cursor data = myDB.getCategories();
                while(data.moveToNext()){
                    Category thisNote = new Category(data.getInt(0), data.getString(1), data.getString(2));
                    adapter.add(thisNote);
                }

                categoryList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> adapterView, View view, final int i, long l) {
                        final Category selectedCategory = (Category) adapterView.getItemAtPosition(i);
                        int duration = Toast.LENGTH_SHORT;
                        String s = "Category celected: "+selectedCategory.getCategoryName();
                        Toast toast = Toast.makeText(context, s, duration);
                        toast.show();
                    }
                });

                builder.setView(mView);

                final AlertDialog selectCategory = builder.create();
                selectCategory.getWindow().setBackgroundDrawable(new ColorDrawable(getResources().getColor(android.R.color.transparent)));
                selectCategory.show();
                View decorView = getWindow().getDecorView();
                decorView.setBackgroundResource(android.R.color.transparent);
                int width = (int)(getResources().getDisplayMetrics().widthPixels*0.80);
                int height = (int)(getResources().getDisplayMetrics().heightPixels*0.80);

                selectCategory.getWindow().setLayout(width, height);

                cancelSelect.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        selectCategory.dismiss();
                    }
                });

        }
    });

【问题讨论】:

  • 很酷的错误 :) 发布一些相关代码,以便我们尝试提供帮助..
  • 什么版本的安卓?有没有不受影响的版本?
  • 我的手机是API 24,模拟器有API 25
  • 你能提供编辑文本逻辑吗,似乎问题与“你将如何使用编辑文本”有关
  • 没有太多逻辑可以提供,只有一个简单的多行 EditText 字段来自女巫,我将内容保存到数据库中,但似乎我找到了导致问题的原因,不知道为什么不过。

标签: android android-edittext


【解决方案1】:

这个答案可能对你有帮助

对话框关闭后写这个

ediText = findViewById(R.id.edit_text);

editText.setSelection(editText.getText().length);

基本上使用上面的逻辑,在dialog关闭时,光标不会指向editText的第一个字符

【讨论】:

    【解决方案2】:

    注意到我试图设置一个透明背景来显示我的自定义对话框 bcg 两次。 那么解决问题的方法是删除两行

    *View decorView = getWindow().getDecorView();
    decorView.setBackgroundResource(android.R.color.transparent);*
    

    不知道为什么会这样。应该检查什么是 getDecorView() 方法。使用它导致发现它作为显示自定义背景的解决方案。

    这条线也可以

    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(getResources().getColor(android.R.color.transparent)));
    

    猜这是橡皮鸭调试的案例 - 只需要告诉别人问题来解决它。感谢大家。

    【讨论】:

    • 您没有为对话框设置两次透明背景。 getWindow() 获取包含适配器的片段或活动的窗口,而不是对话框。 (selectCategory.getWindow() != getWindow())。但是我知道改变它的背景到底有什么影响
    • 好的,我明白View decorView = getWindow().getDecorView(); 的价值了- 它得到什么视图。我试图为我的活动而不是对话框设置透明背景。似乎将活动背景设置为透明会导致活动重新开始或类似的东西,因为我注意到多次打开和关闭对话框,任务栏下的高程阴影变得越来越暗,它在他的 gif 中可见也是。
    【解决方案3】:

    当您关闭或关闭对话框时尝试此代码,

    edittext.setSelection(editText.getText().toString().trim().length);
    

    【讨论】:

      猜你喜欢
      • 2015-05-08
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多