【问题标题】:Change margins when keyboard popup键盘弹出时更改边距
【发布时间】:2014-03-29 03:56:24
【问题描述】:

我得到以下代码是我的 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"

现在发生的情况:当键盘出现时,它也会将其余部分向上(所以下半部分在上半部分,上半部分在屏幕之外)。但我想减少利润,所以一切都保持在上半部分。这可能吗?

您能否帮助我实现这一目标。

【问题讨论】:

    标签: java android margin android-softkeyboard


    【解决方案1】:

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

    /**
     * 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);       
        }
    
        }
    

    【讨论】:

      【解决方案2】:

      This是获取键盘弹出事件的代码。

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

      为了使您的微调器和编辑文本正常工作,您可能需要再次致电onCreate onConfigurationChanged

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

      【讨论】:

        猜你喜欢
        • 2019-03-22
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 2011-08-05
        • 2023-03-09
        • 2018-09-01
        相关资源
        最近更新 更多