Pertanyaan Android EditText, acara soft show / sembunyikan acara?


Apakah mungkin untuk menangkap acara yang Soft Keyboard ditunjukkan atau disembunyikan untuk EditText?


44
2017-09-25 08:44


asal


Jawaban:


Hai, saya menggunakan solusi berikut:

Sejauh pandangan konten saya adalah subkelas dari LinearLayout (bisa berupa tampilan lain atau grup tampilan), saya akan mengganti metode Measure lilke berikut:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    final int proposedheight = MeasureSpec.getSize(heightMeasureSpec);
    final int actualHeight = getHeight();

    if (actualHeight > proposedheight){
        // Keyboard is shown
    } else {
        // Keyboard is hidden
    }

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Solusi ini membantu saya menyembunyikan beberapa kontrol ketika keyboard ditampilkan dan membawa kembali sebaliknya.

Semoga ini bermanfaat.


29
2018-06-12 20:09



Sebenarnya tidak ada kejadian semacam itu untuk ditangkap. IME hanya menampilkan dan menyembunyikan jendelanya; umpan balik yang Anda dapatkan dari ini adalah manajer jendela yang menyebabkan konten jendela Anda sendiri untuk mengubah ukuran jika Anda telah menempatkannya dalam mode mengubah ukuran.


18
2017-09-25 17:50



Saya memecahkan masalah ini dengan menggunakan onGlobalLayoutListener:

 final View activityRootView = findViewById(R.id.top_root);
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();

                if (heightDiff > 100) {
                    // keyboard is up
                } else {
                    // keyboard is down
                }
            }
        });

Di sini activityRootView adalah tampilan akar Kegiatan Anda.


4
2017-08-11 08:35



Dalam kasus saya, saya ingin menyembunyikan bar bawah ketika softkeyboard ditampilkan. Saya menganggap terbaik untuk hanya menyembunyikan bar ketika tata letak memiliki ukuran kurang dari satu persen dari ukuran tata letak normal. Jadi saya menggunakan solusi ini yang berfungsi dengan baik mengingat keyboard lunak biasanya membutuhkan tinggi layar 20% atau lebih. Cukup ubah persen konstan dengan nilai apa pun yang Anda anggap baik. Itu membutuhkan atribut android: windowSoftInputMode = "adjustResize" dalam manifes dan tata letak harus menjadi akar untuk bekerja.

Perluas dari tata letak apa pun yang Anda inginkan, bukan RelativeLayout.

public class SoftKeyboardLsnedRelativeLayout extends RelativeLayout {
    private boolean isKeyboardShown = false;
    private List<SoftKeyboardLsner> lsners=new ArrayList<SoftKeyboardLsner>();
    private float layoutMaxH = 0f; // max measured height is considered layout normal size
    private static final float DETECT_ON_SIZE_PERCENT = 0.8f;

    public SoftKeyboardLsnedRelativeLayout(Context context) {
        super(context);
    }

    public SoftKeyboardLsnedRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @SuppressLint("NewApi")
    public SoftKeyboardLsnedRelativeLayout(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int newH = MeasureSpec.getSize(heightMeasureSpec);
        if (newH > layoutMaxH) {
            layoutMaxH = newH;
        }
        if (layoutMaxH != 0f) {
            final float sizePercent = newH / layoutMaxH;
            if (!isKeyboardShown && sizePercent <= DETECT_ON_SIZE_PERCENT) {
                isKeyboardShown = true;
                for (final SoftKeyboardLsner lsner : lsners) {
                    lsner.onSoftKeyboardShow();
                }
            } else if (isKeyboardShown && sizePercent > DETECT_ON_SIZE_PERCENT) {
                isKeyboardShown = false;
                for (final SoftKeyboardLsner lsner : lsners) {
                    lsner.onSoftKeyboardHide();
                }
            }
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void addSoftKeyboardLsner(SoftKeyboardLsner lsner) {
        lsners.add(lsner);
    }

    public void removeSoftKeyboardLsner(SoftKeyboardLsner lsner) {
        lsners.remove(lsner);
    }

    // Callback
    public interface SoftKeyboardLsner {
        public void onSoftKeyboardShow();
        public void onSoftKeyboardHide();
    }
}

Contoh:

layout / my_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<yourclasspackage.SoftKeyboardLsnedRelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/myLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    ...
</yourclasspackage.SoftKeyboardLsnedRelativeLayout>

MyActivity.java

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_layout);
        SoftKeyboardLsnedRelativeLayout layout = (SoftKeyboardLsnedRelativeLayout) findViewById(R.id.myLayout);
        layout.addSoftKeyboardLsner(new SoftKeyboardLsner() {
            @Override
            public void onSoftKeyboardShow() {
                Log.d("SoftKeyboard", "Soft keyboard shown");
            }

            @Override
            public void onSoftKeyboardHide() {
                Log.d("SoftKeyboard", "Soft keyboard hidden");
            }
        });
    }
}

2
2017-11-22 23:47



coba metode ini: showSoftInput(View, int, ResultReceiver) dan hideSoftInputFromWindow(IBinder, int, ResultReceiver). Anda dapat mengganti onReceiveResult(int resultCode, Bundle resultData) metode dari ResultReceiver kelas untuk menangani acara acara / sembunyikan.


1
2017-09-08 08:29



Banyak pengembang Android yang ingin mengubah tata letak berdasarkan apakah keyboard virtual diperlihatkan atau tidak. Karena itu, Anda dapat melihat solusinya Android: Deteksi softkeyboard terbuka.dan itu bekerja untuk saya dan saya pikir itu sangat berguna juga.


0
2017-10-12 05:39



Anda dapat menangkap ini dengan menimpa onConfigurationChanged metode aktivitas Anda:

@Override
public void onConfigurationChanged(Configuration newConfig) {
   super.onConfigurationChanged(newConfig);

   if(newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
      ((SherlockFragmentActivity)getActivity()).getSupportActionBar().hide();
   }
   else if(newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES){
      ((SherlockFragmentActivity)getActivity()).getSupportActionBar().show();
   }
}

-6
2018-05-29 12:41