【问题标题】:Virtual keyboard does not open when dynamically inserting an EditText view into a Listview将 EditText 视图动态插入 Listview 时,虚拟键盘未打开
【发布时间】:2012-03-25 19:43:20
【问题描述】:

我正在努力解决一个真正让我发疯的问题。我在论坛中发现了类似的问题,但它们都不像这个一样。所以我希望有人对我如何解决这个问题有一个绝妙的主意。或者告诉我我做错了什么。 ;-)

设置:

我有一个列表视图。以下 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>

它是一个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;
        }   
    }
}

当我使用带有注释“获取焦点 1”的(注释掉的)代码部分时,一切正常。 “Entry 1”获得焦点并弹出键盘。

问题:

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

我已经试过了:

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

在不同的论坛上发布,但它没有用。唯一有效的是:

mgr.toggleSoftInput ( 0, 0 );

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

我会非常感谢任何建议!谢谢!

伯纳德

【问题讨论】:

    标签: android listview keyboard focus android-edittext


    【解决方案1】:

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

    InputMethodManager m = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
      if(m != null){
          m.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
       } 
    

    【讨论】:

    • 太棒了!非常感谢!我真的不明白为什么它会这样工作,但无论如何!
    • 如果我的回答对您有帮助,请提高评分或我的回答并将其标记为已接受答案。它会帮助我。
    • 之所以有效,是因为至少目前,InputMethodManager.SHOW_IMPLICIT 是 1,InputMethodManager.HIDE_IMPLICIT_ONLY 也是 1。但是,您应该使用 InputMethodManager.HIDE_IMPLICIT_ONLY 作为隐藏标志。
    【解决方案2】:

    在主视图中添加一个 height=0 的静态 EditText 元素,以欺骗 android 打开键盘:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    
        <!-- bogus EditText to get the keyboard to show up -->
        <EditText
            android:layout_width="match_parent"
            android:layout_height="0dp" />
        <!-- bogus EditText to get the keyboard to show up -->
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/container"
            android:orientation="vertical"/>
    </LinearLayout>
    

    【讨论】:

    • 虽然这似乎可行,但真的希望有一个适当/官方的解决方法来实现这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多