下部に5つのEditText
とButton
とTextView
を含むレイアウトがあります。 EditText
を押すと、キーボードが表示され、all私のView
は腕立て伏せになります。
TextView
とButton
をキーボードの上にプッシュするのではなく、すべてをプッシュするEditText
ScrollView
内からキーボードの上まで。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/activity_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
>
<ScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_weight="1"
Android:background="#ff0"
>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 1"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 2"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 3"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 4"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 5"
Android:inputType="textNoSuggestions"
/>
</LinearLayout>
</ScrollView>
<Button
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:text="Button"
/>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textColor="#000"
Android:text="I don't want to Push this TextView and Button to above keyboard when keyboard is shown. Just obly want to Push the ScrollView that contain all EditText"
/>
</LinearLayout>
私は考えを持っています。キーボードの表示と非表示をいつ聞くか。キーボードを表示するときは、ScrollView =キーボードの高さの下マージンを設定し、キーボードを非表示にするときは、このマージン= 0を設定します。
私のケースをより簡単に処理する方法はありますか?どんな助けや提案も大歓迎です。
[〜#〜]更新[〜#〜]windowSoftInputMode=adjustPan
=>を使用した場合、すべてのEditText
がキーボードの上まで押し上げられるわけではありませんwindowSoftInputMode=adjustResize
=> Button
、TextView
を使用し、すべてのEditText
がキーボードの上まで押し上げられた場合
動作しません-キーボードが表示されたときに検出する信頼できるAPIがありません。このサイトには「解決策」がありますが、誤検知と誤検知があります。しかし、softInputModeをadjustPanに設定するのが最善のようです。これにより、OSは、カーソルがキーボードの上に表示されるのに必要な最小限の量だけ画面全体をスクロールします。 (アプリ全体がキーボードの上にあるのは、adjustResizeモードによるものです)。
すべてのNexusモバイルおよびタブレットデバイスでテスト済み。それはうまくいきます。私はあなたのレイアウトxmlコードを使用しており、ビューにIDのみを追加しました。
私は本番アプリケーションで以下のライブラリを使用していますが、これは非常に有望です。同じことを実現し、アプリgradleに次の行を追加するには: 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.0.1' これが同じリンクです 。
残りのコードについては、以下の要点を参照してください: マニフェストコード、アクティビティコード、アクティビティレイアウトコード 。
Manifest
にAndroid:windowSoftInputMode="adjustPan"
を追加する必要があります。これは、プロのように機能します。
<activity Android:name=".your_activity_name"
Android:windowSoftInputMode="adjustPan">
..............
</activity>
使う Relavtive Layout
親として2つの線形レイアウトを子として、スクロールビューを最初のLinearLayoutに配置し、テキストビューのボタンをもう1つに配置します。
このコードを使用してください。それをテストしました、あなたが期待するように動作します。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/activity_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
>
<LinearLayout
Android:id="@+id/linear"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<ScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_weight="1"
Android:background="#ff0"
>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 1"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 2"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 3"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 4"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 5"
Android:inputType="textNoSuggestions"
/>
</LinearLayout>
</ScrollView>
</LinearLayout>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
Android:layout_below="@id/linear">
<Button
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:text="Button"
/>
<TextView
Android:id="@+id/text"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textColor="#000"
Android:text="I don't want to Push this TextView and Button above keyboard"
/>
</LinearLayout>
</RelativeLayout>
すべてのeditText、button、textviewにIDを指定します:-
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/activity_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
>
<ScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_weight="1"
Android:background="#ff0">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 1"
Android:id="@+id/et1"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 2"
Android:id="@+id/et2"/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 3"
Android:id="@+id/et3"/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 4"
Android:id="@+id/et4"/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 5"
Android:inputType="textNoSuggestions"
Android:id="@+id/et5"/>
</LinearLayout>
</ScrollView>
<Button
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:text="Button"
Android:id="@+id/btn"/>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textColor="#000"
Android:text="I don't want to Push this TextView and Button to above keyboard when keyboard is shown. Just obly want to Push the ScrollView that contain all EditText"
Android:id="@+id/tv"/>
</LinearLayout>
マニフェストで:-
Android:windowSoftInputMode="adjustResize|stateHidden"
あなたの活動では:-
public class Main2Activity extends AppCompatActivity {
EditText e1,e2,e3,e4,e5;
Button button;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
e1=(EditText)findViewById(R.id.et1);
e2=(EditText)findViewById(R.id.et2);
e3=(EditText)findViewById(R.id.et3);
e4=(EditText)findViewById(R.id.et4);
e5=(EditText)findViewById(R.id.et5);
textView=(TextView)findViewById(R.id.tv);
button=(Button)findViewById(R.id.btn);
e1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
hideKeyBoard();
}
});
e2.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
hideKeyBoard();
}
});
e3.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
hideKeyBoard();
}
});
e4.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
hideKeyBoard();
}
});
e5.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
hideKeyBoard();
}
});
}
private void hideKeyBoard(){
final View activityRootView = findViewById(R.id.activity_main);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
if (heightDiff > dpToPx(Main2Activity.this, 200)) { // if more than 200 dp, it's probably a keyboard...
// ... do something here
button.setVisibility(View.GONE);
textView.setVisibility(View.GONE);
}
else {
button.setVisibility(View.VISIBLE);
textView.setVisibility(View.VISIBLE);
}
}
});
}
public static float dpToPx(Context context, float valueInDp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
}
}
ここでは、キーボードが表示されているかどうかを確認しています。そして、それが表示されている場合は、ボタンとテキストビューを非表示にします。
最初のレイアウト変更
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/activity_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<ScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_weight="1"
Android:background="#ff0">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="30dp"
Android:hint="EditText 1"
/>
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="30dp"
Android:hint="EditText 2" />
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="30dp"
Android:hint="EditText 3" />
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="30dp"
Android:hint="EditText 4" />
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="30dp"
Android:hint="EditText 5"
Android:inputType="textNoSuggestions" />
</LinearLayout>
</ScrollView>
<RelativeLayout
Android:id="@+id/rlBtm"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<Button
Android:id="@+id/btn"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Button" />
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/btn"
Android:text="I don't want to Push this TextView and Button to above keyboard when keyboard is shown. Just obly want to Push the ScrollView that contain all EditText"
Android:textColor="#000" />
</RelativeLayout>
</LinearLayout>
次にクラスを追加します
public class KeyboardUtil {
public static void setKeyboardVisibilityListener(Activity activity, final KeyboardVisibilityListener keyboardVisibilityListener) {
final View contentView = activity.findViewById(Android.R.id.content);
contentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
private int mPreviousHeight;
@Override
public void onGlobalLayout() {
int newHeight = contentView.getHeight();
if (mPreviousHeight != 0) {
if (mPreviousHeight > newHeight) {
// Height decreased: keyboard was shown
keyboardVisibilityListener.onKeyboardVisibilityChanged(true);
} else if (mPreviousHeight < newHeight) {
// Height increased: keyboard was hidden
keyboardVisibilityListener.onKeyboardVisibilityChanged(false);
} else {
// No change
}
}
mPreviousHeight = newHeight;
}
});
}
}
そして、onCreateのアクティビティから
KeyboardUtil.setKeyboardVisibilityListener(this, new KeyboardVisibilityListener() {
@Override
public void onKeyboardVisibilityChanged(boolean keyboardVisible) {
rlBtm.setVisibility(keyboardVisible ? View.GONE : View.VISIBLE);
}
});
rlBtmのIDを見つけます。
このレイアウトを追加してみてください、
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/activity_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<ScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_weight="1"
Android:background="#ff0"
>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 1"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 2"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 3"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 4"
/>
<EditText
Android:layout_marginTop="30dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="EditText 5"
Android:inputType="textNoSuggestions"
/>
<Button
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:text="Button"
/>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textColor="#000"
Android:text="any text"
/>
</LinearLayout>
</ScrollView>
</LinearLayout>
以下のコードを使用できます(ただし、この場合、ボタンとテキストビューは画面の終わりでした。それ以外の場合は、線形レイアウトで管理することもできます。ボタンとテキストビューを表示する必要がある場合は、plsが尋ねます。
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<ScrollView
Android:id="@+id/sw1"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout
Android:id="@+id/ll1"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<EditText
Android:layout_width="match_parent"
Android:layout_height="70dp"
Android:layout_marginBottom="10dp"
Android:layout_marginTop="100dp"
Android:background="#ff009988"
Android:padding="10dp"
Android:textColor="#ffffff" />
<EditText
Android:layout_width="match_parent"
Android:layout_height="70dp"
Android:layout_marginBottom="10dp"
Android:background="#ff009988"
Android:padding="10dp"
Android:textColor="#ffffff" />
<RelativeLayout
Android:id="@+id/btmbar"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true">
<Button
Android:id="@+id/button2"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Button" />
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_below="@+id/button2"
Android:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, " />
</RelativeLayout>
</LinearLayout>
</ScrollView>