ExpandableListView の中で、EditText

ExpandableListView の中で、EditText を表示して入力エリアを折りたたんだり、開いたりする場合、
なぜなのか判らないが、日本語入力を始めるとフォーカスが外れてしまう。
 requestFocus をすることで解決する。

以下の画面のような ExpandableListView の中に EditTextがフルに収まった画面が欲しくて書いてみた。

でも、1つできなかったことがある。EditText の範囲選択のハンドルが表示されない。
どうしたら表示できるようになるだろうか?

f:id:posturan:20160313224929p:plain



ExpandableListView の Group View1個、Child 1個の構成で
リストアダプタは、SimpleExpandableListAdapter を使いながらも、
getChildView をオーバーライドして EditTextを埋め込んでしまう。
SimpleExpandableListAdapter のコンストラクタでは、Child のレイアウト、EditText のレイアウトXMLのID や、
表示文字列は、NULL を渡してしまう。
getChildrenCount も1を返すようにする。
初期表示の初期入力値なども設定できる形式にする。

ExpandableListView mExpandableListView;
EditText mEditText;

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   Window window = getWindow();
   window.requestFeature(Window.FEATURE_LEFT_ICON);
   setContentView(R.layout.expand_edit);
   window.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_launcher);

   // ExpandableListView の Group 表示用のデータを用意
   List<Map<String,String>> groupList = new ArrayList<Map<String,String>>();
   Map<String,String> map = new HashMap<String,String>();
   map.put("title", "Note");  // → どうしても Map を用意する必要がある。
   groupList.add(map);

   mExpandableListView = (ExpandableListView)findViewById(R.id.expandableListView1);

   final SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(this
      , groupList, R.layout.expand_group_layout, new String{ "title" }, new int{ R.id.textView1 }
      , null, 0, null, null
   ){
      LayoutInflater infrator = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      @Override
      public View getChildView(int groupPosition,int childPosition,boolean isLastChild,View convertView,ViewGroup parent){

         if (mEditText==null){
            mEditText = (EditText)infrator.inflate(R.layout.expand_edittextview,null);
            mEditText.setText(getInitNote());
         }
         mEditText.requestFocus();
         return mEditText;
      }
      @Override
      public int getChildrenCount(int groupPosition){
         return 1;
      }
   };

   mExpandableListView.setAdapter(adapter);
   // ExpandableListView 開く時
   mExpandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener(){
      @Override
      public void onGroupExpand(int groupPosition){
         // ソフトキーボードを表示する
         InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
         inputMethodManager.showSoftInput(mExpandableListView, 0);
      }
   });
   // ExpandableListView 閉じる時
   mExpandableListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener(){
      @Override
      public void onGroupCollapse(int groupPosition){
         // ソフトキーボードを閉じる
         InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
         inputMethodManager.hideSoftInputFromWindow(mExpandableListView.getWindowToken(), 0);
      }
   });

   // Button クリック等で、mEditText.getText().toString() を実行する

}

   /*
    * Expand の中の EditText の初期値
    */
   protected String getInitNote(){
      return "abc\n11111111\n22222222\n";
   }



expand_edittextview.xml の内容、、、

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:ems="10"
    android:inputType="textMultiLine" >
</EditText>