Android:如何跟踪软键盘是否打开?

时间:2012-09-11 11:55:16

标签: android android-edittext android-softkeyboard

在我的应用程序中,设备软键盘覆盖了EditTextViews,因此用户无法看到他正在输入的内容。

所以我想隐藏其他视图(就像我的情况下的一个按钮),以使EditTextViews可见。

但是做了类似

的事情
EditText.onFocus(){
//hide button
}

对于每个EditText,我想做类似

的事情
if(soft-keyboard.isOpenned())
//hide button
}

如何打开或关闭软键盘?

修改

其实我的布局是这样的:

   <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/transparent"
        android:focusable="true"
        android:focusableInTouchMode="true" >
    </LinearLayout>

    <ImageView
        android:id="@+id/Logo"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:src="@drawable/wic_logo_small" />

    <Button
        android:id="@+id/goButton_iWant"
        android:layout_width="35dp"
        android:layout_height="45dp"
        android:layout_alignParentRight="true"
        android:background="@color/black"
        android:gravity="center_vertical|center_horizontal"
        android:text="@string/go" />

    <AutoCompleteTextView
        android:id="@+id/searchAutoCompleteTextView_iWant"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/goButton_iWant"
        android:layout_toRightOf="@id/Logo"
        android:hint="@string/search"
        android:textColor="@color/white" />

    <TextView
        android:id="@+id/iWantLabel"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/iWantPageLogo"
        android:background="@color/grey"
        android:gravity="center_vertical|center_horizontal"
        android:text="@string/iWant"
        android:textColor="@color/white" />

    <ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/ScrollViewiWant"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/iWantLabel"
        android:scrollbars="vertical" >

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/iNeedToBuy"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/iWantLabel"
                android:gravity="center_vertical|center_horizontal"
                android:padding="5dp"
                android:text="@string/iNeedToBuy"
                android:textColor="@color/white"
                android:textSize="20dp" />

            <AutoCompleteTextView
                android:id="@+id/iNeedToBuyEditText"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/iNeedToBuy"
                android:hint="@string/product"
                android:imeOptions="actionNext"
                android:singleLine="true"
                android:textColor="@color/white"
                android:textSize="15dp" />

            <TextView
                android:id="@+id/error1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/iNeedToBuyEditText"
                android:height="0dp"
                android:text=""
                android:textColor="@color/error_color"
                android:textSize="12dp" />

            <TextView
                android:id="@+id/priceWillingToPay"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/error1"
                android:gravity="center_vertical|center_horizontal"
                android:text="@string/priceWillingToPay"
                android:textColor="@color/white"
                android:textSize="20dp" />

            <EditText
                android:id="@+id/priceWillingToPayEditText"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/priceWillingToPay"
                android:hint="@string/price"
                android:inputType="number"
                android:singleLine="true"
                android:textColor="@color/white"
                android:textSize="15dp" />

            <TextView
                android:id="@+id/error2"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/priceWillingToPayEditText"
                android:height="0dp"
                android:text=""
                android:textColor="@color/error_color"
                android:textSize="12dp" />

            <TextView
                android:id="@+id/needToBuyItBy"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/error2"
                android:gravity="center_vertical|center_horizontal"
                android:text="@string/needToBuyItBy"
                android:textColor="@color/white"
                android:textSize="20dp" />

            <EditText
                android:id="@+id/date_iWant"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/needToBuyItBy"
                android:clickable="true"
                android:cursorVisible="false"
                android:focusable="false"
                android:hint="@string/date"
                android:inputType="none"
                android:singleLine="true"
                android:textColor="@color/white"
                android:textSize="15dp" />

            <TextView
                android:id="@+id/error3"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/date_iWant"
                android:height="0dp"
                android:text=""
                android:textColor="@color/error_color"
                android:textSize="12dp" />

            <DatePicker
                android:id="@+id/datePicker_iWant"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_below="@id/error3"
                android:hint="@string/date"
                android:padding="5dp"
                android:textColor="@color/black"
                android:textSize="15dp" />

            <TextView
                android:id="@+id/iAmIn"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/date_iWant"
                android:gravity="center_vertical|center_horizontal"
                android:text="@string/iAmIn"
                android:textColor="@color/white"
                android:textSize="20dp" />

            <Spinner
                android:id="@+id/city_spinner_iWant"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/iAmIn"
                android:prompt="@string/citySpinner"
                android:textColor="@color/white"
                android:textSize="20dp" />

            <Button
                android:id="@+id/submitButton_iWant"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/city_spinner_iWant"
                android:gravity="center_vertical|center_horizontal"
                android:text="@string/submit"
                android:textColor="@color/white"
                android:textSize="20dp" />

            <TextView
                android:id="@+id/emptySpace"
                android:layout_width="wrap_content"
                android:layout_height="50dp"
                android:layout_below="@id/submitButton_iWant"
                android:gravity="left" />
        </RelativeLayout>
    </ScrollView>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/buttons_iWant"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >

        <Button
            android:id="@+id/feedButton_iWant"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_margin="0dp"
            android:layout_weight="1"
            android:background="@color/white"
            android:text="@string/feed"
            android:textColor="@color/black" />

        <Button
            android:id="@+id/iWantButton_iWant"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_margin="0dp"
            android:layout_weight="1"
            android:background="@color/white"
            android:text="@string/iwant"
            android:textColor="@color/black" />

        <Button
            android:id="@+id/shareButton_iWant"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_margin="0dp"
            android:layout_weight="1"
            android:background="@color/white"
            android:text="@string/share"
            android:textColor="@color/black" />

        <Button
            android:id="@+id/profileButton_iWant"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:layout_margin="0dp"
            android:layout_weight="1"
            android:background="@color/white"
            android:text="@string/profile"
            android:textColor="@color/black" />
    </LinearLayout>

</RelativeLayout>

当我在EditTextViews

ScrollView中输入文字时出现问题

3 个答案:

答案 0 :(得分:5)

没有直接的方法可以找到它,但我提出了一个肮脏的解决方案,它工作正常。背后的想法是比较你的活动和键盘的两个视图的高度。

boolean watcherState;
private void isShowing() {
    final RelativeLayout relative = (RelativeLayout) findViewById(R.id.parent);
    relative.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    // r will be populated with the coordinates of your view
                    // that area still visible.
                    relative.getWindowVisibleDisplayFrame(r);

                    int heightDiff = relative.getRootView().getHeight()
                            - (r.bottom - r.top);
                    Log.d("Height", heightDiff + "//");
                    if (heightDiff > 100) { // if more than 100 pixels, its
                                            // probably a keyboard...
                        watcherState = true;
                    } else
                        watcherState = false;
                }
            });

}

答案 1 :(得分:0)

您应该在清单文件中使用android:windowSoftInputMode属性来描述软键盘显示时屏幕布局应如何排列(http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft

  • android:windowSoftInputMode="adjustResize"
  

活动的主窗口始终调整大小以便为软件腾出空间   键盘在屏幕上。

  • android:windowSoftInputMode="adjustPan"
  

活动的主窗口未调整大小以便为软键盘腾出空间。相反,窗口的内容会自动平移,以便键盘不会遮挡当前焦点,用户可以随时看到他们正在键入的内容。这通常不如调整大小,因为用户可能需要关闭软键盘才能进入并与窗口的模糊部分进行交互。

答案 2 :(得分:0)

要处理软键盘检测,请在android:ConfigChanges文件中为您的活动设置AndroidManifest.xml属性:

<activity android:name="com.myapp.MyActivity"
          android:label="@string/app_name"
          android:configChanges="keyboard|keyboardHidden|orientation"
          >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

此处,keyboard|keyboardHidden中的android:configChanges标志告诉系统,Activity希望调用Activity的onConfigurationChanged()方法,这样您就可以处理softkebaord更改。

以下是一个示例onConfigurationChanged(),它替换了当前正在运行的Activity的主要内容视图:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Set a new layout - framework will automatically choose portrait or landscape as needed
    setContentView( R.layout.my_activity_layout );

    // Reconnect all listeners for controls in the layout
    a.findViewById( R.id.exit_button ).setOnClickListener( mListener );
}

可能的情况是,您的onConfigurationChanged()方法需要完成与Activity的onCreate()方法完全相同的工作,因此通过分解布局来干掉代码可能是个好主意设置为您从onCreate()onConfigurationChanged()调用的单独辅助方法。