我需要在该输入下创建包含文本输入(EditText)和一些项目列表(TextView-s)的活动.状态栏不可见,只有导航栏可见.用户单击EditText后,需要显示软键盘,但系统UI无法更改(状态栏不可见,导航栏可见).用户必须仍然能够滚动到ListView的底部(以便能够看到ListView中的最后一项),而软键盘仍然可见.
问题是我无法实现此行为 - 仅当我使用标志WindowManager.LayoutParams.FLAG_FULLSCREEN时,状态栏才会保持隐藏状态.但在这种情况下,活动内容不会调整大小,键盘将覆盖ListView底部的少量TextView-s.我在这里发现了许多类似的问题,但没有一个描述我的情况(隐形状态栏+可见软键盘+可见活动的所有布局内容).
似乎键盘显示的时候,android会改变UI的一些标志,所以我试着在之后重新设置它们,但没有成功 - 请参阅方法"hideStatusBar()"的用法.
这是我的代码:
布局:
活动:
public class TestActivity extends Activity { private ListView listView; private ArrayAdapteradapter; private List views = new ArrayList<>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_content); adapter = new ArrayAdapter (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中的活动定义:
编辑:
我可能不够清楚.这看起来像我的布局没有显示软键盘: 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显示在layuout上方/上方,这就是为什么无法滚动到ListView中的最后一项.