将EditText视图动态插入Listview时,虚拟键盘无法打开

Ber*_*rnd 1 keyboard android listview focus android-edittext

我正在努力解决一个让我疯狂的问题.我在论坛中发现了类似的问题,但它们都不像这一样.所以我希望有人能够解决这个问题.或者告诉我我做错了什么.;-)

设置:

我有一个ListView.以下XML代码表示子元素:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" 
    android:layout_width    = "match_parent"
    android:layout_height   = "wrap_content"
    android:id              = "@+id/container">

    <EditText android:id            = "@+id/child"
              android:layout_width  = "300dp"
              android:layout_height = "wrap_content" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

它是一个LinearLayout,内部还有一个EditText视图.以下代码将一个子项添加到列表中.由于的EditText视图比它嵌入的LinearLayout,为了测试我已经附上点击收听到这个(第一)的孩子的LinearLayout的空白空间较小.单击此子项时,第二个子项将插入ListView:

public class Keyboard_Bug extends ListActivity
{
    static BugAdapter mAdapter;
    static String [] mNameArray = new String [2];
    static int mCount; 

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mNameArray[0] = "Entry 1";
        mCount = 1;
        mAdapter = new BugAdapter(this);
        setListAdapter(mAdapter);
    }

    public static class BugAdapter extends BaseAdapter
    {
        final LayoutInflater mInflater;
        EditText mView;

        public BugAdapter(Context context)     { mInflater = LayoutInflater.from ( context );   }
        public int  getCount  ()               { return mCount  ; }
        public long getItemId ( int position ) { return position; }
        public Object getItem ( int position ) { return mNameArray[position]; }

        public View getView( int position, View convertView, ViewGroup parent )
        {
            if ( convertView == null )
                convertView = mInflater.inflate(R.layout.child, parent, false);

            mView = (EditText) convertView.findViewById(R.id.child);
            mView.setText(mNameArray[position]);

            // Get focus 1
//          if ( mNameArray[position].equals("Entry 1") )
//              mView.requestFocus();

            // Get focus 2
            if ( mNameArray[position].equals("Entry 2") )
                mView.requestFocus();

            LinearLayout ll = (LinearLayout) convertView.findViewById(R.id.container);

            ll.setOnClickListener(new View.OnClickListener()     {          
                public void onClick(View v) {
                    mNameArray[mCount] = "Entry 2";
                    mCount++;
                    mAdapter.notifyDataSetChanged();
            }});

            return  convertView;
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用(注释掉的)代码部分和评论"获得焦点1"时,一切都很完美."Entry 1"获得焦点,键盘弹出.

问题:

当onClick处理程序现在插入第二个子节点并且我使用带有注释"Get focus 2"的代码部分时,第二个子节点的EditText视图获得焦点(没关系),但是键盘没有打开.我也可以点击新创建的EditText,即使光标闪烁我也无法打开键盘.唯一的方法是选择第一个EditText,然后再次选择第二个EditText.然后键盘打开.

我已经尝试过:

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
Run Code Online (Sandbox Code Playgroud)

如在不同的论坛发布,但它没有工作.唯一有效的是:

mgr.toggleSoftInput ( 0, 0 );
Run Code Online (Sandbox Code Playgroud)

但这当然不是正确的方法,因为如果键盘已经打开,它将被关闭.

我会非常赞赏任何建议!谢谢!

贝恩德

Vip*_*hit 5

在EditText Click事件上使用此代码:

InputMethodManager m = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  if(m != null){
      m.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
   } 
Run Code Online (Sandbox Code Playgroud)