当软键盘可见但不使用全屏标志

时间:2016-01-04 16:45:52

标签: android android-softkeyboard android-fullscreen android-statusbar

我需要在该输入下创建包含文本输入(EditText)和一些项目列表(TextView-s)的活动。状态栏不可见,只有导航栏可见。用户单击EditText后,需要显示软键盘,但系统UI无法更改(状态栏不可见,导航栏可见)。用户必须仍然能够滚动到ListView的底部(以便能够看到ListView中的最后一项),而软键盘仍然可见。

问题是我无法实现此行为 - 仅当我使用标志WindowManager.LayoutParams.FLAG_FULLSCREEN时,状态栏才会保持隐藏状态。但在这种情况下,活动内容不会调整大小,键盘将覆盖ListView底部的少量TextView-s。我在这里发现了许多类似的问题,但没有一个描述我的情况(隐形状态栏+可见软键盘+可见活动的所有布局内容)。

似乎在键盘显示的时候,android会更改UI的一些标志,所以我尝试重新将它们重新设置,但没有成功 - 请参阅方法的使用" hideStatusBar()"。

这是我的代码:

布局:

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


    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="EditText"/>

    <ListView
        android:id="@+id/test_list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>

</LinearLayout>

活动:

public class TestActivity extends Activity {

    private ListView listView;
    private ArrayAdapter<View> adapter;
    private List<View> views = new ArrayList<>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_content);

        adapter = new ArrayAdapter<View>(this, 0, views) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                return views.get(position);
            }
        };

        listView = (ListView) findViewById(R.id.test_list_view);
        listView.setAdapter(adapter);

        TextView textView = null;
        for (int i = 0; i < 50; i++) {
            textView = new TextView(this);
            textView.setText("textView - " + i);
            views.add(textView);
        }

        final View decorView = getWindow().getDecorView();
        decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                hideStatusBar("onSystemUiVisibilityChange");
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        hideStatusBar("onSystemUiVisibilityChange (delayed)");
                    }
                }, 500);
            }
        });
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        hideStatusBar("onWindowFocusChanged");
    }

    public void hideStatusBar(String place) {
        Log.i("test", "hideStatusBar - " + place);
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ;
        decorView.setSystemUiVisibility(uiOptions);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
}

AndroidManifest.xml中的活动定义:

<activity
        android:name="TestActivity"
        android:label="@string/app_name"
        android:windowSoftInputMode="stateHidden|adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
</activity>

修改

我可能不太清楚。 这看起来像我的布局没有显示软键盘: img1

这是显示软键盘后的样子和行&#34; getWindow()。addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);&#34;评论:img2。状态栏可见(这是问题),您可以滚动到ListView中的最后一项。

如果我添加标记&#34; WindowManager.LayoutParams.FLAG_FULLSCREEN&#34;在窗口中,状态栏变为透明但仍然可见,您无法滚动到ListView中的最后一项:img3

我试图在这里找到答案但是每个人都建议通过以下方式之一使用全屏布局

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

或使用全屏主题

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

或通过设置窗口标志

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

这些解决方案中的每一个都有一个问题:keboard显示在layuout上方/上方,这就是为什么无法滚动到ListView中的最后一项。

0 个答案:

没有答案