Android:在屏幕上用软键盘只调整部分视图

我有一个ImageView顶部的Edittext字段的视图。 当键盘出现时,我希望窗口resize,以便EditText不再被键盘隐藏。 在AndroidManifest文件中,我声明了android:windowSoftInputMode="adjustResize"并调整了屏幕大小,但问题是我不希望ImageView重新resize。 我怎样才能使ImageView不受影响?

我可以膨胀一个额外的布局只有ImageView或resize仍然会影响它? 在这里输入图像描述

完整的解决scheme涉及一些关键点

  • 使用RelativeLayout ,使Views可以设置为重叠
  • 使用android:layout_alignParentBottom="true"EditTextWindows的底部alignment
  • 在清单中使用android:windowSoftInputMode="adjustResize" ,这样当popup键盘时, Window的底部会发生变化(如您所述)
  • ImageView放置在ScrollView ,使ImageView可以大于Window ,并使用ScrollView#setEnabled(false)禁用ScrollViewScrollView#setEnabled(false)

这是布局文件

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.so3.MainActivity"> <ScrollView android:id="@+id/scroll" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:src="@drawable/stickfigures"/> </ScrollView> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@android:color/holo_blue_bright" android:text="Please enter text" android:textSize="40sp" android:gravity="center_horizontal"/> </RelativeLayout> 

这是我的活动

 package com.so3; import android.app.Activity; import android.os.Bundle; import android.widget.ScrollView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ScrollView sv = (ScrollView)findViewById(R.id.scroll); sv.setEnabled(false); } } 

我的AndroidManifest

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.so3" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.so3.MainActivity" android:windowSoftInputMode="adjustResize" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

我的解决scheme的屏幕截图

屏幕截图1截图2

对于我来说,我不想假定键盘高度是一定的测量。 无论您关注哪个视图制作onTouchListener,然后执行此操作:

  setOnTouchListener(new OnTouchListener() { Runnable shifter=new Runnable(){ public void run(){ try { int[] loc = new int[2]; //get the location of someview which gets stored in loc array findViewById(R.id.someview).getLocationInWindow(loc); //shift so user can see someview myscrollView.scrollTo(loc[0], loc[1]); } catch (Exception e) { e.printStackTrace(); } }} }; Rect scrollBounds = new Rect(); View divider=findViewById(R.id.someview); myscollView.getHitRect(scrollBounds); if (!divider.getLocalVisibleRect(scrollBounds)) { // the divider view is NOT within the visible scroll window thus we need to scroll a bit. myscollView.postDelayed(shifter, 500); } }); 

//基本上我们做一个runnable,滚动到一个你想要在屏幕上显示的视图的新位置。 只有当它不在滚动视图范围内(它不在屏幕上)时才执行那个可运行的。 这样它将scrollview切换到引用的视图(在我的情况下,“someview”是一个行分隔符)。

在我看来,最简单的方法就是这两个变化的组合

 android:windowSoftInputMode="adjustResize" 

在你的AndroidManifest.xml中

+

 getWindow().setBackgroundDrawable(your_image_drawable); 

在@onCreate()方法的活动中

它适用于我。

 final View activityRootView = findViewById(R.id.mainScroll); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightView = activityRootView.getHeight(); int widthView = activityRootView.getWidth(); if (1.0 * widthView / heightView > 1) { Log.d("keyboarddddd visible", "no"); relativeLayoutForImage.setVisibility(View.GONE); relativeLayoutStatic.setVisibility(View.GONE); //Make changes for Keyboard not visible } else { Log.d("keyboarddddd visible ", "yes"); relativeLayoutForImage.setVisibility(View.VISIBLE); relativeLayoutStatic.setVisibility(View.VISIBLE); //Make changes for keyboard visible } } }); 
  final View activityRootView = findViewById(R.id.mainScroll); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightView = activityRootView.getHeight(); int widthView = activityRootView.getWidth(); if (1.0 * widthView / heightView > 1) { Log.d("keyboarddddd visible", "no"); relativeLayoutForImage.setVisibility(View.GONE); relativeLayoutStatic.setVisibility(View.GONE); //Make changes for Keyboard not visible //relativeLayoutForImage.setVisibility(View.VISIBLE); //relativeLayoutStatic.setVisibility(View.VISIBLE); } else { Log.d("keyboarddddd visible ", "yes"); relativeLayoutForImage.setVisibility(View.VISIBLE); relativeLayoutStatic.setVisibility(View.VISIBLE); //Make changes for keyboard visible // relativeLayoutForImage.setVisibility(View.GONE); //relativeLayoutStatic.setVisibility(View.GONE); } } });