Pertanyaan Cara menggambar tampilan di atas keyboard lunak seperti WhatsApp?


Saya ingin tahu bagaimana itu bisa ditambahkan View di atas Keyboard seperti WhatsApp dan Hangout. Di layar obrolan, mereka memasukkan tampilan emotikon di atas keyboard lunak yang terbuka.

sample image

Adakah yang tahu bagaimana cara mencapai perilaku ini?


32
2018-04-17 12:52


asal


Jawaban:


Yah, saya telah membuat keyboard contoh untuk mengobrol sini...

Di sini, saya menggunakan jendela popup untuk menampilkan jendela popup dan ketinggian popup dihitung secara dinamis oleh ketinggian keyboard

// Initially defining default height of keyboard which is equal to 230 dip
        final float popUpheight = getResources().getDimension(
                R.dimen.keyboard_height);
        changeKeyboardHeight((int) popUpheight);

// Creating a pop window for emoticons keyboard
    popupWindow = new PopupWindow(popUpView, LayoutParams.MATCH_PARENT,
            (int) keyboardHeight, false);

dan tinggi dihitung menggunakan fungsi ini:

/**
 * Checking keyboard height and keyboard visibility
 */
int previousHeightDiffrence = 0;
private void checkKeyboardHeight(final View parentLayout) {

    parentLayout.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {

                    Rect r = new Rect();
                    parentLayout.getWindowVisibleDisplayFrame(r);

                    int screenHeight = parentLayout.getRootView()
                            .getHeight();
                    int heightDifference = screenHeight - (r.bottom);

                    if (previousHeightDiffrence - heightDifference > 50) {                          
                        popupWindow.dismiss();
                    }

                    previousHeightDiffrence = heightDifference;
                    if (heightDifference > 100) {

                        isKeyBoardVisible = true;
                        changeKeyboardHeight(heightDifference);

                    } else {

                        isKeyBoardVisible = false;

                    }

                }
            });

}

Menggunakan semua hal ini saya bisa membuat keyboard yang tumpang tindih sempurna ....

kemudian saya mengembang jendela popup dengan viewpager dan gridview untuk emotikon.

Juga, saya menggunakan string spannable untuk menampilkan emotikon ini di jendela listview dan obrolan


19
2018-05-13 13:13



Setelah melakukan riset dan mencoba-dan-kesalahan, saya menemukan solusi lain yang serupa dengan salah satunya Chirag Jain di atas, tetapi menggunakan Dialog khusus.

    mDialogKeyboard = new Dialog(this,android.R.style.Theme_NoTitleBar);
    mDialogKeyboard.setContentView(R.layout.your_custom_layout);
    mDialogKeyboard.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
    mDialogKeyboard.getWindow().setFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    mDialogKeyboard.getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    mDialogKeyboard.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);

    WindowManager.LayoutParams lp=mDialogKeyboard.getWindow().getAttributes();    
    lp.width=WindowManager.LayoutParams.MATCH_PARENT;
    lp.height=mSoftKeyboardHeight;
    lp.gravity=Gravity.BOTTOM | Gravity.LEFT;
    lp.dimAmount=0;

Terlepas dari kenyataan itu Chirag Jain Jawabannya tampaknya lebih bersih, saya akan posting ini di sini untuk memiliki metode alternatif.


13
2018-05-13 10:04



Sejauh yang saya tahu Anda bisa menggambar di aplikasi lain, ya. Saya sendiri telah merancang aplikasi semacam itu. Seperti menggambar pada aplikasi seperti keyboard atau aplikasi lain secara spesifik, saya kira, Anda harus menentukan tata letak dengan tinggi yang persis seperti keyboard. Jadi, itu bervariasi dari perangkat ke perangkat. Jadi, ini tidak mungkin.

Saya masih tetap berpegang pada pendapat saya bahwa WhatsApp hanya menolak keyboard lunak saat menekan tombol smiley dan menyebut itu fragmen sendiri.

Jika Anda masih ingin mengejar ini, inilah cara Anda menggambar "jendela" di atas aplikasi lain. Ini seharusnya parameter tata letaknya.

params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
                PixelFormat.TRANSLUCENT);

Meskipun, lebar Anda akan berubah menjadi nilai piksel absolut karena Anda ingin aktivitas tersebut melampaui keyboard saja.

Jika saya salah memahami pertanyaan itu, mohon koreksi saya.


3
2018-04-17 15:03



Saya terjebak pada masalah yang sama. Saya akhirnya berhasil menyelesaikannya menggunakan PopupWindow melalui keyboard lunak. Saya telah mengunggah solusi saya sebagai proyek di github: https://github.com/ankushsachdeva/emojicon


3
2017-09-01 21:44



apa yang saya pikirkan adalah mereka telah membuat keypad mereka sendiri untuk tersenyum, dan pada klik ikon senyuman atau ikon keypad mereka menyembunyikan keypad senyuman dan menampilkan keypad normal. ada dua skenario dalam kasus aplikasi apa 1) jika Anda tidak memfokuskan waktu pertama editext maka Anda tidak dapat melihat tombol keypad acara, dan ketinggian keypad senyuman sama persis dengan keypad biasa, kita akan mendapatkan tinggi keypad saja setelah tata letak tampilan kami berubah, berarti hanya setelah tombol ditampilkan, itu berarti mereka membuat papan tombol mereka sendiri .. 2) jika Anda memfokuskan pada teks dan klik tombol senyuman maka akan muncul pilihan untuk menampilkan tombol keypad. jika saya tidak benar dalam hal ini


0
2017-08-29 05:24



Saya baru-baru ini harus menerapkan tampilan yang akan berada di atas keyboard lunak. Solusi @Chirag Jain hampir benar, tetapi tidak dihitung dengan tombol sistem di bagian bawah layar! Ini akan membuat ketinggian keyboard salah pada beberapa perangkat seperti NEXUS 6. Solusi ini harus berfungsi di semua perangkat:

1) buat tata letak yang berisi tampilan Anda

<RelativeLayout
        android:id="@+id/keyboard_info_container"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:background="@color/C12"
        android:padding="10dp"
        android:visibility="invisible">

           ....

    </RelativeLayout>

2) Bind view

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootview = inflater.inflate(R.layout.notifications_email_settings_fragment, container, false);

    ButterKnife.bind(this, rootview);

    checkKeyboardHeight(rootview);

3) periksa keyboard dan lihat pengaturan margin

private void checkKeyboardHeight(final View parentLayout) {

    parentLayout.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {

                int previousHeightDiffrence = 0;
                int systemBarHigh = 999999;

                @Override
                public void onGlobalLayout() {


                    Rect r = new Rect();
                    parentLayout.getWindowVisibleDisplayFrame(r);

                    int screenHeight = parentLayout.getRootView()
                            .getHeight();
                    int keyboardHeight = screenHeight - (r.bottom);

                    if(systemBarHigh > keyboardHeight) {
                        systemBarHigh = keyboardHeight;
                    }

                    if (keyboardHeight > 250) {

                        int keyboardHightWithoutSystemBar = keyboardHeight - systemBarHigh;
                        // no need to update when the keyboard goes down
                        if (previousHeightDiffrence != keyboardHightWithoutSystemBar) { // if (Math.abs(previousHeightDiffrence - keyboardHeight) > 10) {
                            adjustKeyboard(keyboardHightWithoutSystemBar);
                        }

                        keyboardInfoContainer.setVisibility(View.VISIBLE);
                        isKeyBoardVisible = true;
                        previousHeightDiffrence = keyboardHightWithoutSystemBar;

                    } else {
                        isKeyBoardVisible = false;
                        if (keyboardInfoContainer != null) {
                            keyboardInfoContainer.setVisibility(View.INVISIBLE);
                        }
                    }
                }
            });
}

private void adjustKeyboard(int keyboardHeight) {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) keyboardInfoContainer.getLayoutParams();
    lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
    lp.bottomMargin = keyboardHeight;
    keyboardInfoContainer.requestLayout();
}

0
2018-03-09 11:54



@jirkarrr, Mengapa Anda tidak menambahkan keyboardInfoContainer seperti ini:

WindowManager wm = getWindowManager();
WindowManager.LayoutParams lps = new WindowManager.LayoutParams();
lps.x = 0; lps.y = keyboardHeight;
wm.addView(keyboardInfoContainer, lps);

Saya lakukan sebagai kode Anda, tetapi tidak bisa menunjukkan keyboardInfoContainer.


0
2018-05-12 08:13



Saya menggunakan munculan untuk menempatkan tampilan di keyboard:

public void showPopUpKeyboard() {
        mIsPopupVisible = true;
        // Initialize a new instance of LayoutInflater service
        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

        // Inflate the custom layout/view
        View customView = inflater.inflate(R.layout.popup_in_keyboard, null);


        mScrollView = (ScrollView) customView.findViewById(R.id.keyboard_layout_view);
        // Initialize a new instance of popup window
        mPopupWindow = new PopupWindow(
                customView,
                RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.MATCH_PARENT
        );


        setSizeForSoftKeyboard();

        // Get a reference for the custom view close button
        Button closeButton = (Button) customView.findViewById(R.id.ib_close);

        // Set a click listener for the popup window close button
        closeButton.setOnClickListener((View view) -> {
                // Dismiss the popup window
                mIsPopupVisible = false;
                mPopupWindow.dismiss();
        });
        mPopupWindow.showAtLocation(mParentLayout, Gravity.CENTER, 0, 0);

    }

Lalu saya mencoba untuk mengetahui ketinggian keyboard:

mParentLayout.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
                Rect r = new Rect();

                mParentLayout.getWindowVisibleDisplayFrame(r);

                int heightDiff = mParentLayout.getRootView().getHeight() - (r.bottom - r.top);
                if (heightDiff > 100) {
                    //enter your code here
                    if (mIsPopupVisible) {
                        keepKeyboard();
                        mIsPopupVisible = false;
                        mPopupWindow.dismiss();
                    }
                } else {
                    //enter code for hid
                }
        }); 

Anda bisa memeriksanya tutorial dan ini contoh di GitHub


0
2017-11-01 08:59