我需要创建将包含文本输入(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
这是显示软键盘和行“getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);”后的样子 评论:img2。状态栏可见(这就是问题所在),您可以滚动到 ListView 中的最后一项。
如果我在窗口中添加标志“WindowManager.LayoutParams.FLAG_FULLSCREEN”,状态栏将变为透明但仍然可见,并且您无法滚动到 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 显示在布局上方/上方,这就是为什么无法滚动到 ListView 中的最后一项的原因。