繁体   English   中英

键盘弹出时更改边距

[英]Change margins when keyboard popup

我在下面的代码是我的main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/textView1"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="80dp"
        android:paddingTop="10dp"
        android:text="@string/parameter"
        android:textColor="@color/White"
        android:textSize="18sp" />

    <Spinner
        android:id="@+id/spinner1"
        style="@layout/spinner_layout"
        android:layout_width="120dp"
        android:layout_height="55dp"
        android:layout_alignLeft="@+id/spinner3"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="22dp"
        android:paddingLeft="5dp"
        tools:listitem="@android:layout/simple_list_item_1" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/spinner1"
        android:layout_alignBottom="@+id/spinner1"
        android:layout_alignLeft="@+id/output2"
        android:layout_alignParentRight="true"
        android:ems="10"
        android:inputType="numberDecimal" >

        <requestFocus />
    </EditText>

    <Spinner
        android:id="@+id/spinner3"
        android:layout_width="120dp"
        android:layout_height="55dp"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="320dp"
        android:layout_toRightOf="@+id/textView7" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/textView7"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="80dp"
        android:text="@string/transmission"
        android:textColor="@color/White"
        android:textSize="18sp" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView1"
        android:layout_alignBottom="@+id/textView1"
        android:layout_alignLeft="@+id/EditText1"
        android:layout_alignRight="@+id/EditText1"
        android:ems="10"
        android:inputType="numberDecimal"
        android:text="70" />

    <EditText
        android:id="@+id/EditText1"
        android:layout_width="120dp"
        android:layout_height="55dp"
        android:layout_above="@id/editText2"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="50dp"
        android:ems="10"
        android:hint="@string/uren"
        android:inputType="number|numberDecimal" />

    <TextView
        android:id="@+id/textView7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignTop="@+id/spinner3"
        android:text="@string/out"
        android:textColor="@color/White"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/output2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView7"
        android:layout_alignBottom="@+id/textView7"
        android:layout_alignLeft="@+id/EditText1"
        android:layout_alignParentRight="true"
        android:background="@drawable/box"
        android:paddingTop="10dp"
        android:text="@string/textview"
        android:textSize="18sp" />

    <Spinner
        android:id="@+id/spinner2"
        style="@layout/spinner_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/textView1"
        android:layout_marginBottom="80dp"
        android:layout_marginLeft="20dp"
        android:layout_toLeftOf="@+id/EditText1"
        android:layout_toRightOf="@id/textView2" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignTop="@+id/editText1"
        android:text="@string/in"
        android:textColor="@color/White"
        android:textSize="18sp" />

</RelativeLayout>

这是上面的代码当键盘出现时会发生这种情况

我想要的是当键盘弹出,删除或减少边距时,所有内容都将在屏幕的上半部分保持可见(因为键盘使用了一半以下。当键盘消失时,我想要一切都回来了正常。

现在苦苦挣扎了2个小时,所以不要发布我尝试过的所有东西......我在清单中得到了android:windowSoftInputMode="adjustResize"

现在发生了什么:当键盘出现时,它也将其余部分调高(所以下半部分位于上半部分,上半部分位于屏幕外部)。 但我想减少利润,所以一切都保持在上半部分。 这可能吗?

你能帮助我实现这个目标吗?

使用此自定义相对布局来检测软键盘。 基于键盘调整布局参数(边距)。

/**
 * RelativeLayout that can detect when the soft keyboard is shown and hidden.
 *  
 */

public class RelativeLayoutThatDetectsSoftKeyboard extends RelativeLayout {

    public RelativeLayoutThatDetectsSoftKeyboard(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public interface Listener {
        public void onSoftKeyboardShown(boolean isShowing);
    }
    private Listener listener;
    public void setListener(Listener listener) {
        this.listener = listener;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = MeasureSpec.getSize(heightMeasureSpec);
        Activity activity = (Activity)getContext();
        Rect rect = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
        int statusBarHeight = rect.top;
        int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
        int diff = (screenHeight - statusBarHeight) - height;
        if (listener != null) {
            listener.onSoftKeyboardShown(diff>128); // assume all soft keyboards are at least 128 pixels high
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);       
    }

    }

是您可以通过它获取键盘弹出事件的代码。

在这种情况下,您需要以编程方式更改边距,或者在键盘弹出时设置替代布局,在这种情况下这很容易。 更改布局将导致已输入的值丢失。 但是,您也可以将它们保存在局部变量中,当您更改布局时,在布局更改时使用这些值以在较旧的布局中预设输入的值。

要使您的微调器和编辑文本起作用,您可能需要在onConfigurationChanged再次调用onCreate

PS: - 这只是一个想法,可能还有其他方法来实现这一点,但你也可以试试这个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM