SORU
15 EKİM 2010, Cuma


Yolunu kesmek yumuşak klavye geri düğmesi

Çeşitli giriş alanları ile aktivite var. Etkinlik başladığında yumuşak klavye görüntülenir. Geri düğmesi yumuşak klavye kapatır bastırdı ve aktivite kapatmak için bir kez daha düğmeye basın geri istiyorum.

Şimdi soru şu: button yumuşak klavye önünü kapatmak için geri ve 5 ** özel oluşturmadan geri düğmeye tek bir basın etkinliği bitirmek mümkün mü?

Diğer durumlarda geri düğmesi yakalamak için nasıl biliyorum P. S.: bu durumda işe yaramıyor ama onKeyDown() onBackPressed() geri düğmesi sadece ikinci basın durdurmuştu.

CEVAP
27 NİSAN 2011, ÇARŞAMBA


Evet, tamamen mümkün ve klavyeyi göstermek veya gizlemek ve Geri düğmesine aramaları yakalamak için. API bunu yapmak için doğrudan bir yol yoktur belirtildiği gibi, küçük bir ekstra çaba. Anahtar bir düzen içinde boolean dispatchKeyEventPreIme(KeyEvent) geçersiz kılmak için. Biz ne düzeni oluşturun. Benim Etkinlik üssü olduğu RelativeLayout seçtim.

<?xml version="1.0" encoding="utf-8"?>
<com.michaelhradek.superapp.utilities.SearchLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.michaelhradek.superapp"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/white">

Bizim Faaliyet içine girdi yuvamızı kurduk ve setActivity(...) işlevini çağırın.

private void initInputField() {
    mInputField = (EditText) findViewById(R.id.searchInput);        

    InputMethodManager imm = 
        (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 
            InputMethodManager.HIDE_IMPLICIT_ONLY);

    mInputField.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(TextView v, int actionId,
                KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                performSearch();
                return true;
            }

            return false;
        }
    });

    // Let the layout know we are going to be overriding the back button
    SearchLayout.setSearchActivity(this);
}

Belli ki, initInputField() işlevi giriş alanı oluşturur. Ayrıca bu işlevi çalıştırmak için anahtarı (benim durumumda bir arama girin sağlar.

@Override
public void onBackPressed() {
    // It's expensive, if running turn it off.
    DataHelper.cancelSearch();
    hideKeyboard();
    super.onBackPressed();
}

onBackPressed() çağrıldığında bizim düzen içinde biz sonra klavyeyi gizlemek gibi istediğimiz her şeyi:

private void hideKeyboard() {
    InputMethodManager imm = (InputMethodManager) 
        getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(mInputField.getWindowToken(), 0);
}

Her neyse, işte RelativeLayout benim geçersiz kılar.

package com.michaelhradek.superapp.utilities;

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.RelativeLayout;

/**
 * The root element in the search bar layout. This is a custom view just to 
 * override the handling of the back button.
 * 
 */
public class SearchLayout extends RelativeLayout {

    private static final String TAG = "SearchLayout";

    private static Activity mSearchActivity;;

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

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

    public static void setSearchActivity(Activity searchActivity) {
        mSearchActivity = searchActivity;
    }

    /**
     * Overrides the handling of the back key to move back to the 
     * previous sources or dismiss the search dialog, instead of 
     * dismissing the input method.
     */
    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        Log.d(TAG, "dispatchKeyEventPreIme("   event   ")");
        if (mSearchActivity != null && 
                    event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            KeyEvent.DispatcherState state = getKeyDispatcherState();
            if (state != null) {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getRepeatCount() == 0) {
                    state.startTracking(event, this);
                    return true;
                } else if (event.getAction() == KeyEvent.ACTION_UP
                        && !event.isCanceled() && state.isTracking(event)) {
                    mSearchActivity.onBackPressed();
                    return true;
                }
            }
        }

        return super.dispatchKeyEventPreIme(event);
    }
}

Ne yazık ki tüm kredi alamam. Eğer source for the quick SearchDialog box Android işaretlerseniz fikri nereden geldiğini göreceksiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • megablueblaster

    megablueblas

    23 HAZİRAN 2006
  • Murray Winiata

    Murray Winia

    2 ŞUBAT 2009
  • Need for Speed

    Need for Spe

    8 ŞUBAT 2006