自定义Android首选项类型在键入时失去焦点

时间:2010-12-21 11:35:17

标签: android

我创建了一个简单的首选项类,它显示了一个AutoCompleteTextView控件,它显示正常,但是当我专注于AutoCompleteTextView并开始输入时,它会调出键盘然后立即失去对控件的关注。

知道为什么会失去焦点吗?

这是我创建视图所做的。膨胀的布局只是一个基本的线性布局,其中包含标题文本视图。

我可以将它改为对话框偏好而不是我想但如果它可以成为基本视图的一部分它会更顺畅。

@Override
protected View onCreateView(ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.base_preference, null);

    if (mHint != null) {
        TextView hintView = (TextView) layout.findViewById(R.id.PreferenceHintTextView);
        hintView.setText(mHint);
    }

    TextView titleView = (TextView) layout.findViewById(R.id.PreferenceTitleTextView);
    titleView.setText(getTitle());

    AutoCompleteTextView inputView = new AutoCompleteTextView(getContext());
    inputView.setGravity(Gravity.FILL_HORIZONTAL);

    ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getContext(),
            R.layout.auto_complete_text_list_item,
            getEntries());

    inputView.setAdapter(adapter);
    inputView.setThreshold(1);
    inputView.setOnItemSelectedListener(this);
    layout.addView(inputView);

    return layout;
}

列表项是:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="16sp"
    android:textColor="#000">
</TextView>

可能是标准的列表项,并且相同。

2 个答案:

答案 0 :(得分:0)

我花了一些时间为您重新创建此问题:

几个问题:

  1. 什么是 getContext() /从中获取上下文?
  2. 您能否展示 R.layout.auto_complete_text_list_item ?标准清单项目对我有用
  3. 您能否展示 getEntries()方法?在使用一个小的String []数组进行测试后,它对我有用。
  4. setOnItemSelectedListener(this) - 您可以在实现 OnItemSelectedListener 时显示您正在使用的方法 - 您可能需要在此处使用requestFocus()或正在执行奇怪的操作将焦点从控件上移开......虽然这是针对选择而非点击。我不确定这是否是由列表本身自动选择(即默认为第一项
  5. 最后,尝试将组件设置为xml,而不是动态地进行测试。这是我试图控制的第一个因素。我知道你会希望它是动态的,但创建一个使用自己的布局的自定义AutoCompleteTextView控件并不一定是坏事。

    希望这些帮助!一个项目肯定会帮助我审查和协助。

答案 1 :(得分:0)

我遇到了同样的问题,假定的偏好在ListView中处理。

因此,在获得焦点的OnFocusChangeListener()调用中,我调用此方法来解决问题。请注意,每个设备或Android版本都不会出现此问题,这可能会导致首先很难检测到。

在运行Android 4.1.1的华硕设备上重现问题。

private boolean fixedAlready = false;
private void fixListViewFocusability(View v)
{
    if (fixedAlready)
        return;

    Log.d(at_data.TAG, "Trying to fix focus issues from " + v);

    ViewGroup vg = (ViewGroup) v.getParent();
    while (vg != null)
    {
        if (vg instanceof ListView)
        {
            Log.d(at_data.TAG, "Found list view " + vg);
            ListView lv = (ListView) vg;

            fixedAlready = true;
            lv.setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS);

            break;
        }

        vg = (ViewGroup) vg.getParent();
    }
}

以上在我的特定设备上工作。不确定其他设备会如何反应。