2010-12-21 42 views
3

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> 

は、おそらく標準のリスト項目となってと同じ出て来ている可能性があります。

+0

私は同様の問題がありますが、私の場合は簡単なEditViewを使用しています。あなたは解決策を見つけましたか? – noisy

+0

デモプロジェクトは非常に助けになるでしょう... –

+0

申し訳ありませんが解決策を見つけることができませんでした。私はちょうどそれが多くの時間を燃やしていたので、期待どおりに動き、移動したダイアログの設定に変更しました。私がそれに戻ってそれを整理すれば、私は解決策を投稿します。 – Brian

答えて

0

私はあなたのための再作成、この問題にしようと少しの時間を費やし:質問の

カップル:

  1. のgetContextが(何が) /からコンテキストを取得?
  2. R.layout.auto_complete_text_list_itemを表示できますか?標準リスト項目は私のために働いた
  3. getEntries()メソッドを表示できますか?小さなString []配列でテストしたところ、それは私のために働いていました。
  4. setOnItemSelectedListener(この) - それはOnItemSelectedListenerを実装して、あなたがこのために使用している方法を表示することができます - あなたがのrequestFocusを(必要な場合があります)ここたり離れたりコントロールから注力引っ張るために奇妙な何かをやっています...これはであり、ではありません。です。私はこれがリスト自体によって自動的に選択されたとして発砲しているかどうかはわかりません(つまり、最初の項目をデフォルトにしている)

最後に、コンポーネントをxmlに設定してください。私がコントロールしようとした最初の要素ですが、これを動的にしたいと思うでしょうが、独自のレイアウトを使用するカスタムAutoCompleteTextViewコントロールを作成することは必ずしも悪いことではありません。私は見直しと支援をします。

+0

getContext()は、クラスが継承しているPreferenceから継承されています。 R.layout.auto_complete_text_list_itemは標準リスト項目とほぼ同じです。 getEntriesは、private変数から直接CharSequence []を返します。 OnItemSelectedListenerのハンドラをメインポストに追加することもできます。 – Brian

+0

ありがとうございます。私はこの設定を正確に再現しようとしています。カスタム・プリファレンスを作成してメイン・ビューを操作しているのでちょっと奇妙です...このカスタムAutoCompleteTextViewを生成するためにPreferenceクラスを拡張しています(preference.xmlに追加する可能性もあります)。すべての設定を保持するPreferenceActivity?それが後者の場合は、新しいクラスを作成して "AutoCompletePreference"にして、自分自身を開いてユーザー入力を処理するか、間違った接頭語にしたいと思いませんか?また、あなたの投稿にOnItemSelectedハンドラが表示されません... –

0

私は同じ問題があり、想定された環境設定はListView内で処理されます。

したがって、OnFocusChangeListener()呼び出しでフォーカスが得られたら、このメソッドを呼び出して問題を解決します。問題はすべてのデバイスやAndroidバージョンで発生しないため、最初に検出することが非常に困難になる可能性があります。

Android 4.1.1を実行しているAsusデバイスで問題を再現しました。

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(); 
    } 
} 

この特定のデバイスでは、上記のことがわかりました。他のデバイスがどのように反応するかはわかりません。

関連する問題