Kaip patikrinti „Android“ programinės įrangos klaviatūros matomumą?

Turiu padaryti labai paprastą dalyką - išsiaiškinti, ar rodoma programinės įrangos klaviatūra. Ar įmanoma „Android“?

469
27 янв. nustatytas ant fhucho sausio 27 2010-01-27 23:39 '10, 23:39, 2010-01-27 23:39
@ 38 atsakymai
  • 1
  • 2

NAUJAS ATSAKYMAS pridėtas 2012 m. Sausio 25 d

Po to, kai parašėte atsakymą žemiau, kažkas man pasakė apie „ ViewTreeObserver“ ir draugų, API, kurie buvo paslėpti SDK, buvimą nuo 1 versijos.

Vietoj to, kad reikalautumėte pasirinktinio išdėstymo tipo, daug paprastesnis sprendimas yra suteikti savo šakninio aktyvumo vaizdui žinomą identifikatorių, pvz., @+id/activityRoot , prijungti „GlobalLayoutListener“ į „ViewTreeObserver“ ir iš ten apskaičiuoti dydžio skirtumą tarp veiklos tipo šaknies ir >

 final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); if (heightDiff > dpToPx(this, 200)) { // if more than 200 dp, it probably a keyboard... // ... do something here } } }); 

Naudojant įrankį, pvz .:

 public static float dpToPx(Context context, float valueInDp) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics); } 

Lengva!

Pastaba: Jūsų paraiška turi būti pažymėta „Android“ „Manifest android:windowSoftInputMode="adjustResize" kitaip sprendimas neveiks.

ORIGINALUS ATSAKYMAS

Taip, galbūt, bet tai yra daug sudėtingesnė nei turėtų būti.

Jei man reikia pasirūpinti, kad klaviatūra pasirodytų ir dingtų (tai yra gana paplitusi), tai, ką darau, onMeasure() savo aukščiausio lygio išdėstymo klasę į vieną, kuri nepaiso onMeasure() . Pagrindinė logika yra ta, kad jei išdėstymas yra užpildytas iki mažesnio dydžio nei bendras >

 import android.app.Activity; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.widget.LinearLayout;  public class LinearLayoutThatDetectsSoftKeyboard extends LinearLayout { public LinearLayoutThatDetectsSoftKeyboard(Context context, AttributeSet attrs) { super(context, attrs); } public interface Listener { public void onSoftKeyboardShown(boolean isShowing); } private Listener listener; public void setListener(Listener listener) { this.listener = listener; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int height = MeasureSpec.getSize(heightMeasureSpec); Activity activity = (Activity)getContext(); Rect rect = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight = rect.top; int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight(); int diff = (screenHeight - statusBarHeight) - height; if (listener != null) { listener.onSoftKeyboardShown(diff>128); // assume all soft keyboards are at least 128 pixels high } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } 

Tada savo veiklos klasėje ...

 public class MyActivity extends Activity implements LinearLayoutThatDetectsSoftKeyboard.Listener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... LinearLayoutThatDetectsSoftKeyboard mainLayout = (LinearLayoutThatDetectsSoftKeyboard)findViewById(R.id.main); mainLayout.setListener(this); ... } @Override public void onSoftKeyboardShown(boolean isShowing) { // do whatever you need to do here } ... } 
637
19 янв. atsakymas pateikiamas Reuben Scratton 19 sausis 2011-01-19 18:42 '11 at 18:42 2011-01-19 18:42

Taigi, tikiuosi, tai padės kam nors išeiti.

Naujas atsakymas, kurį davė Reuben Scratton, yra puikus ir tikrai veiksmingas, tačiau jis tikrai veikia tik tada, kai parametrą „windowSoftInputMode“ nustatysite norėdami sureguliuoti. Jei nustatysite, kad konfigūruotumėte PAN, vis dar neįmanoma nustatyti, ar klaviatūra bus matoma su jo kodo fragmentu. Norėdami tai padaryti, aš padariau šį nedidelį pirmiau minėto kodo pakeitimą.

border=0
 final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... ... do something here } } }); 
290
02 февр. Atsakymas pateikiamas Kachi 02 vasario mėn. 2012-02-02 09:45 '12 at 9:45 am 2012-02-02 09:45

Atsiprašome už vėlyvą atsakymą, bet sukūriau nedidelę pagalbininko klasę darbui su atvirais / uždarais įvykiais, pranešus klausytojams ir kitiems naudingiems dalykams, gal kas nors tai naudinga:

 import android.graphics.Rect; import android.view.View; import android.view.ViewTreeObserver; import java.util.LinkedList; import java.util.List; public class SoftKeyboardStateWatcher implements ViewTreeObserver.OnGlobalLayoutListener { public interface SoftKeyboardStateListener { void onSoftKeyboardOpened(int keyboardHeightInPx); void onSoftKeyboardClosed(); } private final List<SoftKeyboardStateListener> listeners = new LinkedList<SoftKeyboardStateListener>(); private final View activityRootView; private int lastSoftKeyboardHeightInPx; private boolean isSoftKeyboardOpened; public SoftKeyboardStateWatcher(View activityRootView) { this(activityRootView, false); } public SoftKeyboardStateWatcher(View activityRootView, boolean isSoftKeyboardOpened) { this.activityRootView = activityRootView; this.isSoftKeyboardOpened = isSoftKeyboardOpened; activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(this); } @Override public void onGlobalLayout() { final Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. activityRootView.getWindowVisibleDisplayFrame(r); final int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); if (!isSoftKeyboardOpened  heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... isSoftKeyboardOpened = true; notifyOnSoftKeyboardOpened(heightDiff); } else if (isSoftKeyboardOpened  heightDiff < 100) { isSoftKeyboardOpened = false; notifyOnSoftKeyboardClosed(); } } public void setIsSoftKeyboardOpened(boolean isSoftKeyboardOpened) { this.isSoftKeyboardOpened = isSoftKeyboardOpened; } public boolean isSoftKeyboardOpened() { return isSoftKeyboardOpened; }  public int getLastSoftKeyboardHeightInPx() { return lastSoftKeyboardHeightInPx; } public void addSoftKeyboardStateListener(SoftKeyboardStateListener listener) { listeners.add(listener); } public void removeSoftKeyboardStateListener(SoftKeyboardStateListener listener) { listeners.remove(listener); } private void notifyOnSoftKeyboardOpened(int keyboardHeightInPx) { this.lastSoftKeyboardHeightInPx = keyboardHeightInPx; for (SoftKeyboardStateListener listener : listeners) { if (listener != null) { listener.onSoftKeyboardOpened(keyboardHeightInPx); } } } private void notifyOnSoftKeyboardClosed() { for (SoftKeyboardStateListener listener : listeners) { if (listener != null) { listener.onSoftKeyboardClosed(); } } } } 

Naudojimo pavyzdys:

 final SoftKeyboardStateWatcher softKeyboardStateWatcher = new SoftKeyboardStateWatcher(findViewById(R.id.activity_main_layout); // Add listener softKeyboardStateWatcher.addSoftKeyboardStateListener(...); // then just handle callbacks 
51
14 окт. atsakė Artem Zinnatullin 2013-10-14 08:53 '13, 8:53, 2013-10-14 08:53

Tai visada buvo kompiuterio požiūriu, tačiau šis klausimas vis dar yra neįtikėtinai aktualus!

Taigi, aš paėmiau pirmiau pateiktus atsakymus ir juos šiek tiek sujungiau ir paaiškinau ...

 public interface OnKeyboardVisibilityListener { void onVisibilityChanged(boolean visible); } public final void setKeyboardListener(final OnKeyboardVisibilityListener listener) { final View activityRootView = ((ViewGroup) getActivity().findViewById(android.R.id.content)).getChildAt(0); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { private boolean wasOpened; private final int DefaultKeyboardDP = 100; // From @nathanielwolf answer... Lollipop includes button bar in the root. Add height of button bar (48dp) to maxDiff private final int EstimatedKeyboardDP = DefaultKeyboardDP + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 48 : 0); private final Rect r = new Rect(); @Override public void onGlobalLayout() { // Convert the dp to pixels. int estimatedKeyboardHeight = (int) TypedValue .applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP, activityRootView.getResources().getDisplayMetrics()); // Conclude whether the keyboard is shown or not. activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); boolean isShown = heightDiff >= estimatedKeyboardHeight; if (isShown == wasOpened) { Log.d("Keyboard state", "Ignoring global layout change..."); return; } wasOpened = isShown; listener.onVisibilityChanged(isShown); } }); } 

Dirba man :)

PASTABA. Jei pastebėsite, kad „ DefaultKeyboardDP“ netinka jūsų įrenginiui, žaiskite naudodami vertę ir palikite komentarą, kad visi žinotų, kokia vertė turėtų būti ... galiausiai gausime tinkamą vertę visiems įrenginiams!

Išsamesnės informacijos ieškokite Kyborgo įgyvendinime

49
25 сент. atsakymas pateikiamas TacB0sS 25 sep . 2013-09-25 00:58 '13 - 0:58 2013-09-25 00:58

Kai kurie patobulinimai, siekiant išvengti klaidingo klaviatūros matomumo didelio tankio įrenginiuose klaidingo aptikimo:

  • Aukščio skirtumas turi būti 128 dp , o ne 128 pikseliai.
    Žr. „Google“ projektavimo projektą, skirtą metrikams ir tinklui , 48 dp už patogų jutiklinį objektą ir 32 dp mygtukus. Tipiška minkšta klaviatūra turėtų apimti 4 eilių raktų, todėl minimalus klaviatūros aukštis turėtų būti: 32 dp * 4 = 128 dp , o tai reiškia, kad slenksčio dydis turėtų būti perkeltas į pikselius, padauginant įrenginio tankį. Xxxhdpi įrenginiams (tankis 4) minkšta klaviatūros aukščio riba turėtų būti 128 * 4 = 512 taškų.

  • Aukščio skirtumas tarp šakninio ir matomo ploto:
    šakninio vaizdo aukštis - būsenos juostos aukštis - matomas rėmo aukštis = apatinis šaknų vaizdas - matomas apatinis rėmo apačia, nes būsenos juostos aukštis yra lygus viršutiniam šakninio rodinio rėmelio kraštui.

     private final String TAG = "TextEditor"; private TextView mTextEditor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_editor); mTextEditor = (TextView) findViewById(R.id.text_editor); mTextEditor.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { isKeyboardShown(mTextEditor.getRootView()); } }); } private boolean isKeyboardShown(View rootView) {  final int SOFT_KEYBOARD_HEIGHT_DP_THRESHOLD = 128; Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); DisplayMetrics dm = rootView.getResources().getDisplayMetrics();  int heightDiff = rootView.getBottom() - r.bottom;  boolean isKeyboardShown = heightDiff > SOFT_KEYBOARD_HEIGHT_DP_THRESHOLD * dm.density; Log.d(TAG, "isKeyboardShown ? " + isKeyboardShown + ", heightDiff:" + heightDiff + ", density:" + dm.density + "root view height:" + rootView.getHeight() + ", rect:" + r); return isKeyboardShown; } 
31
02 окт. atsakymą pateikė „ Orchard Cafe 02 oct. 2014-10-02 03:00 '14 3:00 2014-10-02 03:00

Aš praleidžiau šiek tiek laiko, kad išsiaiškintume ... Buvau keletas „CastExceptions“, bet supratau, kad galite keisti „LinearLayout“ į layout.xml su klasės pavadinimu.

Čia jis yra:

 <?xml version="1.0" encoding="UTF-8"?> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/llMaster"> <com.ourshoppingnote.RelativeLayoutThatDetectsSoftKeyboard android:background="@drawable/metal_background" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/rlMaster" > <LinearLayout android:layout_width="fill_parent" android:layout_height="1dip" android:background="@drawable/line"></LinearLayout> .... </com.ourshoppingnote.RelativeLayoutThatDetectsSoftKeyboard> </LinearLayout> 

Taigi, jums nereikia susidurti su problemomis.

... ir jei nenorite to daryti kiekviename puslapyje, rekomenduojame naudoti „MasterPage Android“. Žr. Nuorodą čia: http://jnastase.alner.net/archive/2011/01/08/ldquomaster-pagesrdquo-in-android.aspx

8
09 июля '11 в 10:39 2011-07-09 10:39 atsakymą pateikė Janus Kamp Hansen liepos 09 '11, 10:39 2011-07-09 10:39

Elemento aukščio patikra nėra patikima, nes kai kurios klaviatūros, pvz., „WifiKeyboard“, yra nulinio aukščio.

Vietoj to, galite patikrinti showSoftInput () ir hideSoftInput () skambinimo rezultatus, kad patikrintumėte klaviatūros būseną. Išsami informacija ir pavyzdinis kodas

https://rogerkeays.com/how-to-check-if-the-software-keyboard-is-shown-in-android

6
21 февр. Atsakymą pateikė Roger Keays 21 vasaris. 2012-02-21 02:50 '12 2:50 2012-02-21 02:50

Idėja yra ta, kad jei reikia paslėpti klaviatūrą ir tuo pačiu metu patikrinti minkštos įvesties būseną, naudokite šį sprendimą:

 public boolean hideSoftInput() { InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); return imm.hideSoftInputFromWindow(mViewPager.getWindowToken(), 0); } 

Šis būdas grąžinamas teisingai, jei klaviatūra buvo rodoma prieš slepiant.

5
06 дек. George Maisuradze atsakymas: gruodis 06 2013-12-06 16:01 '13, 16:01, 2013-12-06 16:01

Užuot laikę diferencijuotą kodavimą, aš tai padariau, nes mano paraiškoje turėjau meniu parinkčių.

 final View root= findViewById(R.id.myrootview); root.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightDiff = root.getRootView().getHeight() - root.getHeight(); Rect rectgle= new Rect(); Window window= getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rectgle); int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); if(heightDiff <= contentViewTop){ //Soft KeyBoard Hidden }else{ //Soft KeyBoard Shown } } }); 
4
29 сент. Atsakymas, kurį pateikė Santhosh Shettigar Rgs 29 2012-09-29 12:32 '12 12:32 2012-09-29 12:32

Paslėptą paslėptą klaviatūrą galite stebėti „decorView“ funkcija.

 public final class SoftKeyboardUtil { public static final String TAG = "SoftKeyboardUtil"; public static void observeSoftKeyBoard(Activity activity , final OnSoftKeyBoardHideListener listener){ final View decorView = activity.getWindow().getDecorView(); decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect rect = new Rect(); decorView.getWindowVisibleDisplayFrame(rect); int displayHight = rect.bottom - rect.top; int hight = decorView.getHeight(); boolean hide = (double)displayHight / hight > 0.8 ; if(Log.isLoggable(TAG, Log.DEBUG)){ Log.d(TAG ,"DecorView display hight = "+displayHight); Log.d(TAG ,"DecorView hight = "+ hight); Log.d(TAG, "softkeyboard visible = " + !hide); } listener.onSoftKeyBoardVisible(!hide); } }); } public interface OnSoftKeyBoardHideListener{ void onSoftKeyBoardVisible(boolean visible); } } 
3
23 янв. atsakymas pateikiamas Zebulon Li 23 jan. 2014-01-23 08:34 '14 at 8:34 2014-01-23 08:34

Taip pat yra sprendimas su sistemos įdėjimais, tačiau jis veikia tik su API >= 21 ( Android L ). Tarkime, kad turite „ BottomNavigationView , kuri yra „ LinearLayout vaikas, ir jūs turite jį slėpti, kai rodoma klaviatūra:

 > LinearLayout > ContentView > BottomNavigationView 

Jums tereikia pratęsti „ LinearLayout tokį:

 public class KeyboardAwareLinearLayout extends LinearLayout { public KeyboardAwareLinearLayout(Context context) { super(context); } public KeyboardAwareLinearLayout(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public KeyboardAwareLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public KeyboardAwareLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { int childCount = getChildCount(); for (int index = 0; index < childCount; index++) { View view = getChildAt(index); if (view instanceof BottomNavigationView) { int bottom = insets.getSystemWindowInsetBottom(); if (bottom >= ViewUtils.dpToPx(200)) { // keyboard is shown view.setVisibility(GONE); } else { // keyboard is hidden view.setVisibility(VISIBLE); } } } return insets; } } 

Idėja yra ta, kad, .bottom klaviatūrą, sistema įterpia pakeitimą, turėdama gana didelę.

3
15 февр. Atsakymą pateikė nikis vasaris 15. 2018-02-15 18:38 '18, 18:38 pm 2018-02-15 18:38

Radau, kad @Reuben_Scratton metodo ir @Yogesh metodo derinys geriausiai tinka. Suderinus jų metodus, tai bus kažkas panašaus:

 final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (getResources().getConfiguration().keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) { // Check if keyboard is not hidden // ... do something here } } }); 
3
01 февр. atsakymas pateikiamas cbradley 01 Feb. 2012-02-01 00:44 '12 ne 0:44 2012-02-01 00:44

Čia gali padėti paslėptas metodas „ InputMethodManager.getInputMethodWindowVisibleHeight . Bet aš nežinau, kodėl tai paslėpta.

 import android.content.Context import android.os.Handler import android.view.inputmethod.InputMethodManager class SoftKeyboardStateWatcher(private val ctx: Context) { companion object { private const val DELAY = 10L } private val handler = Handler() private var isSoftKeyboardOpened: Boolean = false private val height: Int get() { val imm = ctx.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val method = imm.javaClass.getMethod("getInputMethodWindowVisibleHeight") method.isAccessible = true return method.invoke(imm) as Int } private val task: Runnable by lazy { Runnable { start() if (!isSoftKeyboardOpened  height > 0) { isSoftKeyboardOpened = true notifyOnSoftKeyboardOpened(height) } else if (isSoftKeyboardOpened  height == 0) { isSoftKeyboardOpened = false notifyOnSoftKeyboardClosed() } } } var listener: SoftKeyboardStateListener? = null interface SoftKeyboardStateListener { fun onSoftKeyboardOpened(keyboardHeightInPx: Int) fun onSoftKeyboardClosed() } fun start() { handler.postDelayed(task, DELAY) } fun stop() { handler.postDelayed({ if (!isSoftKeyboardOpened) handler.removeCallbacks(task) }, DELAY * 10) } private fun notifyOnSoftKeyboardOpened(keyboardHeightInPx: Int) { listener?.onSoftKeyboardOpened(keyboardHeightInPx) } private fun notifyOnSoftKeyboardClosed() { listener?.onSoftKeyboardClosed() } } 
2
22 мая '18 в 7:30 2018-05-22 07:30 atsakė Kevin Du gegužės 22 d., 18 val., 07:30, 2018-05-22 07:30

Tai buvo visam laikui kompiuterio požiūriu, tačiau šis klausimas vis dar yra labai svarbus! Todėl sutinku su aukščiau pateiktais atsakymais ir šiek tiek pagerėjau ...

 public interface OnKeyboardVisibilityListener { void onVisibilityChanged(boolean visible); } public final void setKeyboardListener(final OnKeyboardVisibilityListener listener) { final View activityRootView = ((ViewGroup) getActivity().findViewById(android.R.id.content)).getChildAt(0); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { private boolean wasOpened; private final Rect r = new Rect(); @Override public void onGlobalLayout() { activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); boolean isOpen = heightDiff > 100; if (isOpen == wasOpened) { logDebug("Ignoring global layout change..."); return; } wasOpened = isOpen; listener.onVisibilityChanged(isOpen); } }); } 

Jis veikia man.

2
16 дек. Atsakymą pateikė Roselyn Soffer gruodžio 16 d. 2016-12-16 11:24 '16 at 11:24 2016-12-16 11:24

Nė vienas iš šių sprendimų neveiks kaip Lollipop. „Lollipop“ activityRootView.getRootView().getHeight() yra mygtuko juostos aukštis, kai trūksta peržiūros matmens. Aš pritaikiau geriausią / lengviausią sprendimą, kad galėčiau dirbti su „Lollipop“.

  final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); Resources res = getResources(); // The status bar is 25dp, use 50dp for assurance float maxDiff = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, res.getDisplayMetrics()); //Lollipop includes button bar in the root. Add height of button bar (48dp) to maxDiff if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { float buttonBarHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 48, res.getDisplayMetrics()); maxDiff += buttonBarHeight; } if (heightDiff > maxDiff) { // if more than 100 pixels, its probably a keyboard... ...do something here } } }); 
2
19 нояб. Atsakymą pateikė nathanielwolf 19 lapkritis 2014-11-19 02:01 '14, 2:01 am 2014-11-19 02:01

Aš naudoju nedidelį Reubano atsakymą, kuris tam tikromis aplinkybėmis pasirodė esąs naudingesnis, ypač su didelės raiškos įrenginiais.

 final View activityRootView = findViewById(android.R.id.content); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightView = activityRootView.getHeight(); int widthView = activityRootView.getWidth(); if (1.0 * widthView / heightView > 3) { //Make changes for Keyboard not visible } else { //Make changes for keyboard visible } } }); 
2
22 февр. Atsakymą pateikė PearsonArtPhoto vasario 22 d. 2014-02-22 01:07 '14 at 1:07 2014-02-22 01:07

Pabandykite atlikti šiuos veiksmus:

 final View activityRootView = getWindow().getDecorView().getRootView(); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); if (heightDiff < activityRootView.getRootView().getHeight() / 4 ) { // if more than 100 pixels, its probably a keyboard... // ... do something here ... \\ } } }); 
1
24 окт. Ofek Ashery atsakymas, pateiktas spalio 24 d. 2017-10-24 18:33 '17 18:33 2017-10-24 18:33

Mano atsakymas iš esmės yra toks pat, kaip ir Kachi, bet aš jį suvyniu į asistento klasę, kad išvalyčiau būdą, kuriuo jis naudojosi.

 import android.app.Activity; import android.app.Fragment; import android.graphics.Rect; import android.view.View; import android.view.ViewTreeObserver.OnGlobalLayoutListener;  public class KeyboardStatusDetector { KeyboardVisibilityListener visibilityListener; boolean keyboardVisible = false; public void registerFragment(Fragment f) { registerView(f.getView()); } public void registerActivity(Activity a) { registerView(a.getWindow().getDecorView().findViewById(android.R.id.content)); } public KeyboardStatusDetector registerView(final View v) { v.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); v.getWindowVisibleDisplayFrame(r); int heightDiff = v.getRootView().getHeight() - (r.bottom - r.top); if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...  if(!keyboardVisible) { keyboardVisible = true; if(visibilityListener != null) visibilityListener.onVisibilityChanged(true); } } else { if(keyboardVisible) { keyboardVisible = false; if(visibilityListener != null) visibilityListener.onVisibilityChanged(false); } } } }); return this; } public KeyboardStatusDetector setVisibilityListener(KeyboardVisibilityListener listener) { visibilityListener = listener; return this; } public static interface KeyboardVisibilityListener { public void onVisibilityChanged(boolean keyboardVisible); } } 

Tai galite naudoti, norėdami aptikti klaviatūros pakeitimus bet kurioje programos vietoje:

  new KeyboardStatusDetector() .registerFragment(fragment) //register to a fragment .registerActivity(activity) //or register to an activity .registerView(view) //or register to a view .setVisibilityListener(new KeyboardVisibilityListener() { @Override public void onVisibilityChanged(boolean keyboardVisible) { if(keyboardVisible) { //Do stuff for keyboard visible }else { //Do stuff for keyboard hidden } } }); 

Pastaba Naudokite tik vieną iš „registro“ skambučių. Jie visi dirba taip pat ir yra prieinami tik patogumui.

1
17 окт. atsakymas, kurį pateikė billylindeman spalio 17 d 2014-10-17 18:48 '14, 18:48, 2014-10-17 18:48

Turiu problemų palaikant klaviatūros būseną keičiant fragmentų orientaciją peržiūros programoje. Aš nesu įsitikinęs, kodėl, bet tai tiesiog atrodo gremėzdiškas ir veikia kitaip nei įprastinė veikla.

Norėdami išsaugoti klaviatūros būseną šiuo atveju, pirmiausia turite pridėti „ android:windowSoftInputMode = "stateUnchanged" į„ AndroidManifest.xml . Tačiau galite pastebėti, kad tai iš tikrųjų neišsprendžia visos problemos - klaviatūra man nebuvo atidaryta, jei ji anksčiau buvo atidaryta prieš keičiant orientaciją. Visais kitais atvejais elgesys atrodė teisingas.

Tada turime įgyvendinti vieną iš čia paminėtų sprendimų. Самый чистый, который я нашел, был Джордж Майсурадзе - используйте логический обратный вызов из hideSoftInputFromWindow:

 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); return imm.hideSoftInputFromWindow(mViewPager.getWindowToken(), 0); 

Я сохранил это значение в моем методе Fragment onSaveInstanceState и получил его onCreate . Затем я принудительно показал клавиатуру в onCreateView , если она имела значение true (она возвращает true, если клавиатура видна до фактического скрытия ее до разрушения фрагмента).

1
ответ дан Quantum Dot 21 авг. '17 в 3:13 2017-08-21 03:13