0

背景

我有我的活动的下一个布局:

  • 垂直线性布局
    • 带有 viewPager 的 TabHost。
    • “状态栏”(imageView/textView)。

有时,在 viewPager 中,我有一个带有 EditText 的片段。

问题

在某些屏幕(如 Galaxy mini)上,我注意到当您单击 editText(以便写入)时,软键盘会隐藏所有内容,因此您只剩下 actionBar、选项卡和状态栏.

我试过的

这就是为什么我决定在清单上为此活动添加下一个标志:

android:windowSoftInputMode="adjustPan|adjustResize|stateHidden"

这看起来是一个完美的解决方案 - 它在键入时隐藏了操作栏、选项卡,甚至状态栏,为 editText 留下了足够的空间来显示(并且还可以滚动到它)。

但是,在更大的屏幕上测试它(比如 Galaxy S3 的屏幕),这会导致在 editText 位于底部的情况下,softKeyboard 会覆盖 editText。

我试图删除 adjustPan 标志,它适用于大屏幕,但在小屏幕上,即使它已滚动到 editText,状态栏也会隐藏它。

我还尝试将某些视图的isScrollContainer设置为 true ,希望它会导致它们在编辑时调整大小,但它没有做任何事情。

问题

我该怎么做才能解决这个问题并处理各种屏幕?

我可以检查屏幕的类型并以编程方式使用适当的标志(如这里),但我不确定规则应该是什么(密度/分辨率/屏幕尺寸),以及我是否真的涵盖了它们的所有类型。

4

1 回答 1

1

尝试android:windowSoftInputMode="adjustPan

具有附加功能

制作另一个像这样的课程

package com.example.customLayout;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

public class MyRelativeLayout extends RelativeLayout
{
    private OnRelativeLayoutChangeListener layoutChangeListener;

    public interface OnRelativeLayoutChangeListener 
    {
        void onLayoutPushUp();
        void onLayoutPushDown();
    }

    public MyRelativeLayout(Context context, AttributeSet attributeSet) 
    {
        super(context, attributeSet);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    {
        try 
        {
            final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
            final int actualHeight = getHeight();
            if (actualHeight > proposedheight)
            {
                // Keyboard is shown
                layoutChangeListener.onLayoutPushUp();
            }
            else if(actualHeight < proposedheight)
            {
                // Keyboard is hidden
                layoutChangeListener.onLayoutPushDown();
            }
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }   

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void setLayoutChangeListener(OnRelativeLayoutChangeListener layoutChangeListener) 
    {
        this.layoutChangeListener = layoutChangeListener;
    }

    public OnRelativeLayoutChangeListener getLayoutChangeListener() 
    {
        return layoutChangeListener;
    }
}

现在在您的布局 xml 文件中将此类的自定义视图作为父级,如下所示

<com.example.customLayout.MyRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.example.customLayout"

    android:id="@+id/customRelativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


// your original layout file

</com.example.customLayout.MyRelativeLayout>

在你的java文件中尝试以下代码

myRelativeLayout=(MyRelativeLayout)findViewById(R.int.customRelativeLayout);

 myRelativeLayout.setLayoutChangeListener(new OnRelativeLayoutChangeListener() {

                public void onLayoutPushUp() 
                {
                    Controller_Test1.tabWidget.setVisibility(View.GONE);    
                }

                public void onLayoutPushDown() 
                {
                    Controller_Test1.tabWidget.setVisibility(View.VISIBLE);
                }
            });
于 2013-02-05T10:05:08.290 回答