Android - 填充屏幕的布局(使用重量)和软键盘输出时可滚动

时间:2014-03-20 13:13:26

标签: android layout

我需要构建一个填充屏幕的布局。我使用在子视图中具有权重的LinearLayout来做到这一点。

这种布局是一种形式,所以当软键盘输出时我也需要它可以滚动。

当键盘退出时,屏幕高度会缩小,因此视图也会缩小,挤在一起。他们看起来很糟糕。

你知道有什么方法可以构建一个填充屏幕但同时保留其外观的表单布局,并且当软键盘输出时可以滚动吗?这在iOS中非常简单,但在Android中......我想不出解决方案。

谢谢

4 个答案:

答案 0 :(得分:1)

iOS总是拥有相同的屏幕尺寸,而Android则不然。您需要在Android中使用响应式设计,因为您不知道用户使用的屏幕有多大。

我不认为你需要重量(不管是不是顶点)来解决这个问题。 只需使用ScrollView并在其中添加LinearLayout(方向:垂直)。 在此LinearLayout中添加视图,如果需要水平放置多个视图。添加另一个LinearLayout(方向:水平) 在您的视图上设置边距以获得它们之间的良好距离。

这将允许具有小屏幕的用户在您的布局中滚动,如果用户有键盘输出,他们也可以滚动。

<ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:orientation="vertical" >

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"/>

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"/>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"/>

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"/>
            </LinearLayout>

        </LinearLayout>
    </ScrollView>

前两个将位于彼此之下。 接下来的两个将彼此相邻,如果您希望它们具有不同的大小,则在此处应用权重

答案 1 :(得分:0)

在滚动视图和清单中定义表单,使 windowSoftInputMode configChanges 条目如下所示

    <activity
        android:name="com.example.MainActivity"
        android:label="@string/app_name" 
        android:screenOrientation="portrait" 
        android:windowSoftInputMode="stateAlwaysHidden|adjustResize"           
        android:configChanges="keyboardHidden|orientation">

</activity>

希望这可以帮到你。

答案 2 :(得分:0)

我已经构建了以下scheduleConsolideHeights方法来解决问题。感谢Joakim的评论。

虽然它适用于我,但我相信它可以改进。欢迎提出任何建议。

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.XXX);

        // LinearLayout from your R.layout.XXX that has vertical orientation and
        // its children have weights instead of absolute heights
        final LinearLayout layout = (LinearLayout) findViewById(R.id.layout_with_weights);

        scheduleConsolideHeights(layout);
    }

    /**
     * Adds a listener to the layout {@link ViewTreeObserver} to wait for the view measurements
     * and then calls {@link #consolideHeights(LinearLayout)}.
     */
    private static void scheduleConsolideHeights(final LinearLayout layout) {

        final ViewTreeObserver viewTreeObserver = layout.getViewTreeObserver();

        if (viewTreeObserver.isAlive()) {
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    consolideHeights(layout);
                }
            });
        }
    }

    /**
     * Note: you might want to use {@link #scheduleConsolideHeights(android.widget.LinearLayout)}.
     *
     * Takes a {@link android.widget.LinearLayout} and, for each of its child views, sets the height
     * of the child's LayoutParams to the current height of the child.
     *
     * Useful when a {@link android.widget.LinearLayout} that has relative heights (with weights)
     * may display the keyboard. With absolute heights, the layout maintains its aspect when the soft
     * keyboard appears.
     *
     * See: http://stackoverflow.com/q/22534107/1121497
     */
    private static void consolideHeights(LinearLayout layout) {

        for (int i = 0; i < layout.getChildCount(); i++)
        {
            final View child = layout.getChildAt(i);
            final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) child.getLayoutParams();
            params.height = child.getHeight();
            params.weight = 0;
            child.setLayoutParams(params);
        }
    }
}

答案 3 :(得分:0)

正如that question中的SiGangteng回应必须帮助您解决问题(在清单中的具体内容)

android:windowSoftInputMode="adjustPan"