0

我有一个edittext,当我点击它时,我得到了我需要的数字软键盘。但是当我在edittext之外单击时,我会得到常规键盘,但是在用户在edittext之外单击后我需要隐藏键盘。键盘也应该在滚动时消失,而不仅仅是在 OnClick 上。

public View getView(int position, View convertView, ViewGroup parent) {
            StoreSkuInfo storeSkuInfo = StoreSkuInfoList.get(position);  

            View row = convertView;
            String status="";
            StoreSkuHolder holder = null;

            if (row ==null) {    

                LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                row = mInflater.inflate(R.layout.pip_pickupinstore_listcell, null);

                holder = new StoreSkuHolder();

                            holder.qtyText = (EditText)row.findViewById(R.id.pip_qty_et);
                holder.qtyLL = (LinearLayout)row.findViewById(R.id.qty_LL);
                holder.pipQuantityStatus = (TextView) row.findViewById(R.id.quantity_status);
                holder.relativeLayoutStoreInfo = (RelativeLayout) row.findViewById(R.id.RelativeLayoutStoreInfo);
                holder.relativeLayoutAisleBay = (RelativeLayout) row.findViewById(R.id.RelativeLayoutAisleBay);


                row.setTag(holder);

            }else{
                holder = (StoreSkuHolder)row.getTag();
            }
}

我们知道这个 getView 方法会被多次调用,因此将以下代码放入 getView 方法中会在单击 edittext 时每秒上下调整键盘。

holder.qtyText.setOnFocusChangeListener(new OnFocusChangeListener() {

                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    // TODO Auto-generated method stub
                    if(hasFocus) {
                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
                    }
                    if(!hasFocus) {
                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
//                      imm.hideSoftInputFromWindow(v.getWindowToken(), 1);
                    }
                }
            });

如何解决这个问题?

编辑: 尝试了 Shruti 的回答,如下所示。我将以下代码放在父类中:

public static void hideSoftKeyboard(Activity activity) 
    {

        if(activity!= null && activity.getCurrentFocus() != null && activity.getCurrentFocus().getWindowToken() != null)
        {
            InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);            
        }
    }

然后在 OnCreate 中,我输入:

findViewById(android.R.id.content).getRootView().setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d(TAG, "In setOnTouchListener of root");
                hideSoftKeyboard(PIPActivity.this);
                return false;
            }
        });

但是代码甚至没有进入这个 TouchListener。

编辑 2 我尝试了 Shashank Agarwal 的答案。但他的回答是针对布局的。如果用户点击其他任何地方,我需要键盘消失。下面是一张图片来澄清。

活动布局

EDITTEXT 位于下方的 XML 布局。我已从中删除了一些行,以尝试保持重点。讨论中的 EditText 位于底部:android:id="@+id/pip_qty_et"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/shiptostore_cell"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dip"
    android:background="@color/ce"
    android:onClick="onClick"
    android:clickable="true"
    android:focusable="true"
    android:orientation="horizontal" >

    <RelativeLayout
        android:id="@+id/pip_store_cell_rl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dip"
        android:layout_marginBottom="20dip"
        android:gravity="center"
        android:paddingBottom="5dp"
        android:paddingRight="5dp"
        android:paddingTop="5dp" >

       <com.HDTextView
            android:id="@+id/pickupinstore_availtoday"
            style="@style/Normal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dip"
            android:layout_below="@+id/pickupinstore_milesaway"
            android:text="Available for Pick Up TODAY"
            android:textColor="@color/C7" />

        <RelativeLayout
            android:id="@+id/RelativeLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/pickupinstore_availtoday"
            android:layout_marginTop="15dip" >

            <com.HDTextView
                android:id="@+id/seperator"
                android:layout_width="0dip"
                android:layout_height="0dip"
                android:layout_centerInParent="true" />

            <RelativeLayout
                android:id="@+id/RelativeLayoutAisleBay"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:layout_marginLeft="3dp"
                android:layout_toLeftOf="@id/seperator"
                android:visibility="gone" >

                <com.HDTextView
                    android:id="@+id/pickupinstore_bin"
                    style="@style/Small"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="8dip"
                    android:layout_toRightOf="@+id/pickupinstore_aisle"
                    android:maxWidth="70dp"
                    android:singleLine="true"
                    android:text="Bay [x]"
                    android:textColor="@color/RGB51" />

            </RelativeLayout>

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="2dip"
                android:layout_toRightOf="@id/storeLocationButton"
                android:gravity="center" >

                <com.HDTextView
                    android:id="@+id/quantity_status"
                    style="@style/SmallBold"
                    android:layout_width="wrap_content"
                    android:layout_height="20dp"
                    android:layout_gravity="center_vertical"
                    android:layout_marginRight="5dp"
                    singleLine="true"
                    android:background="@drawable/bevelededge_mob_lightest_green"
                    android:gravity="center"
                    android:minWidth="20dp"
                    android:paddingLeft="2dp"
                    android:paddingRight="2dp"
                    android:text="99"
                    android:textColor="@color/White"
                    android:textSize="12dip" />

            </RelativeLayout>
        </RelativeLayout>

        <LinearLayout 
            android:id="@+id/qty_LL"
            android:layout_width="50dip"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:orientation="vertical"
            android:clickable="true"
            android:focusable="true"
            android:layout_alignParentRight="true">

                <com.HDTextView
                    style="@style/Small"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:singleLine="true"
                    android:text="QTY"
                    android:textColor="@color/Grey" />

                <EditText
                    android:id="@+id/pip_qty_et"
                    android:layout_width="45dip"
                    android:layout_height="wrap_content"
                    android:background="@null"
                    android:layout_alignParentRight="true"
                    android:focusable="true"
                    android:focusableInTouchMode="true"
                    android:imeOptions="actionDone"
                    android:gravity="center"
                    android:hint="5"
                    android:onClick="test"
                    android:inputType="number"
                    android:maxLength="3" />

        </LinearLayout>"


        <RelativeLayout
            android:id="@+id/RelativeLayoutStoreInfo"
            android:layout_width="150dip"
            android:layout_height="wrap_content"
            android:layout_above="@+id/RelativeLayout"
            android:layout_alignLeft="@+id/pickupinstore_storename"
            android:layout_alignParentTop="true">
        </RelativeLayout>
    </RelativeLayout>

</LinearLayout>
4

5 回答 5

1

Sample layout xml file.

<RelativeLayout android:id="@+id/rootLayout"...

<Textview.../>
<Button../>

....
...

<RelativeLayout/>

In the above sample relative layout is the rootLayout.

By rootLayout I mean the parent layout for that layout.

In your case it is LinearLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/shiptostore_cell"..../>

Try this :

public static void hideSoftKeyboard(Activity activity) 
    {

        if(activity!= null && activity.getCurrentFocus() != null && activity.getCurrentFocus().getWindowToken() != null)
        {
            InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);            
        }
    }

call this function on touch of the root layout and it will work.

rootLayout.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                hideSoftKeyboard(QuestionTemplateActivity.this);
                return false;
            }
        });
于 2013-10-18T13:55:57.333 回答
1

将此代码放在 onCreate 之外

public void onClick(View view) {
        InputMethodManager imm = (InputMethodManager) view.getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }

在您的布局 xml 文件中,将此行放在父布局上,使其变为可点击

android:onClick="onClick"   
于 2013-10-18T14:51:32.903 回答
1

我知道为时已晚,它可能对您没有帮助,但这对其他人有帮助。如果要隐藏默认键盘,则可以在EditText 的 XML文件中添加以下行。

android:keyboardNavigationCluster="false"

于 2018-08-15T04:35:13.683 回答
0

这将起作用:

    @Override
public boolean dispatchTouchEvent(MotionEvent event) {

    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);

    if (v instanceof EditText) {
        View w = getCurrentFocus();
        int scrcoords[] = new int[2];
        w.getLocationOnScreen(scrcoords);
        float x = event.getRawX() + w.getLeft() - scrcoords[0];
        float y = event.getRawY() + w.getTop() - scrcoords[1];

        Log.d("Activity",
                "Touch event " + event.getRawX() + "," + event.getRawY()
                        + " " + x + "," + y + " rect " + w.getLeft() + ","
                        + w.getTop() + "," + w.getRight() + ","
                        + w.getBottom() + " coords " + scrcoords[0] + ","
                        + scrcoords[1]);
        if (event.getAction() == MotionEvent.ACTION_UP
                && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
                        .getBottom())) {

            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                    .getWindowToken(), 0);
        }
    }
    return ret;
}
于 2013-10-21T12:20:02.553 回答
0

这就是我所做的。这很有效,因为我需要键盘在点击或滚动时隐藏自己。

@Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
                if (getCurrentFocus() != null) {
                      InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                      imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
                    }
            return super.dispatchTouchEvent(ev);
        }
于 2013-10-22T18:22:45.947 回答