2010-11-03 25 views
24

Sadece bir telefonda test ediyorum (HTC Incredible, Android 2.2, Software 3.21.605.1), aşağıdaki davranışları yaşıyorum.OnEditorActionListener SenseUI klavye üzerinde aynı eventTime ile iki kez çağrıldı

Sense UI klavyesi üzerindeki Enter tuşuna basıldığında onEditorAction olay işleyicisine iki kez (hemen) çağrılıyor.

KeyEvent.getEventTime() bu iş-geçici beni lider, olay denir hem kez aynıdır:

protected void onCreate(Bundle savedInstanceState) { 
    [...] 

    EditText text = (EditText)findViewById(R.id.txtBox); 
    text.setOnEditorActionListener(new OnEditorActionListener() { 
     private long lastCalled = -1; 

     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if (event.getEventTime() == lastCalled) { 
       return false; 
      } else { 
       lastCalled = event.getEventTime(); 
       handleNextButton(v); 
       return true; 
      } 
     } 
    }); 

    [...] 
} 

EditText olarak tanımlanır:

<EditText 
    android:layout_width="150sp" 
    android:layout_height="wrap_content" 
    android:id="@+id/txtBox" 
    android:imeOptions="actionNext" 
    android:capitalize="characters" 
    android:singleLine="true" 
    android:inputType="textVisiblePassword|textCapCharacters|textNoSuggestions" 
    android:autoText="false" 
    android:editable="true" 
    android:maxLength="6" 
/> 

Açık Test ettiğim tüm diğer cihazlar, eylem düğmesi "Next" (İleri) olarak etiketlenir ve bu düğmeye basıldığında yalnızca bir tek olay olarak adlandırılır.

Bu, Sense UI'nin klavyesinde bir hata mı, yoksa yanlış bir şey mi yapıyorum?

Yardımlarınız için teşekkür ederiz.


Güncelleme - verilen cevaplar sayesinde, çeklerime aşağıdaki gibi karar verdim. Bu teste Kullanılabilir durumda telefonların hem çalışıyor (Sense UI ve Cyanogenmod CM7)

  if (event != null && event.getAction() != KeyEvent.ACTION_DOWN) { 
       return false; 
      } 

      if (actionId != EditorInfo.IME_ACTION_NEXT && actionId != EditorInfo.IME_NULL) { 
       return false; 
      } 
+2

Sizin için bir cevap yok Korkarım, bugün bu konuya çarptığımı söylemek istedim. HTC Sense klavyeyi daha önce hiç görmemiştim .. ugh!Ve metinNoSuggestions bayrağını görmezden gelerek nasıl kurtuldular? UI'imi biraz zayıflatır, çürür. –

+0

Klavyenin varsayılan düğmeyi (her zaman "Enter") uygulamaması nedeniyle pek çok uygulamanın tam olarak düzgün çalışmadığını fark ettim. Buna Google tarafından sağlanan başvurular dahildir (bence ilk kayıt işlemi de dahil). HTC'nin gözden kaçırması için oldukça büyük bir şey gibi görünüyor. Bu bir utanç, çünkü Motoblur'dan daha fazla SenseUI'yi seviyorum. Onay için teşekkürler. – mbafford

cevap

26

action_down olayı kontrol edebilirsiniz, olay eylemi kontrol etmek zorunda:

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
    if (event.getAction() != KeyEvent.ACTION_DOWN) 
     return false; 

    // do your stuff 

    return true; 
} 

Bu parçacık Sense UI ve emülatörü hem çalışır.

+2

Neredeyse başka bir cevap gibi görünüyor, diğer telefonumda (CyanogenMod CM7 çalıştıran), klavyede "İleri" ye bastığımda "olay" null, dolayısıyla bunu da kontrol etmeliyim. – mbafford

+1

Ayrıca bir ekledim "if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED) false;" Yönteme . – AlexVogel

0

yerine bir etkinlik olarak bir ime aksiyon ve boş göndererek, bu senin almıyor yani eğer dokunmatik etkinliği gönderir mitch söylediği gibi doğru eylem action_up veya

+1

Burada ne söylediğini anlamıyorum. HTC'nin Sense UI'sinde ve varsayılan eylemi düzgün bir şekilde uygulayan diğer klavyelerde düzgün çalışacak bir etkinlik var mı? – mbafford

3
(EditText) passwordView = (EditText) findViewById(R.id.password); 
passwordView.setImeOptions(EditorInfo.IME_ACTION_DONE); 
    passwordView.setOnEditorActionListener(new OnEditorActionListener() 
     { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
      { 
       String input; 
       if(actionId == EditorInfo.IME_ACTION_DONE) 
       { 
        input= v.getText().toString(); 
        Toast toast= Toast.makeText(LogIn.this,input, 
          Toast.LENGTH_LONG); 
        toast.setGravity(Gravity.CENTER, 0, 0); 
        toast.show(); 
        return true; 
       } 
       return false; 
      } 
     }); 
0

Doğru; ur davayı Kullandıktan sonra ve tekrar

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 

       if (actionId == EditorInfo.IME_NULL) 
       { 
        Log.i("here","Add product "); 
        return true; //this does the trick 
       } 
       return false; 
      }  
1

true dönerseniz Bence denilen alışkanlık, bunu, ona IME_ACTION_DONE ulaşıncaya kadar olayların kalanı ilgilenen anlamına gelir. Yani eğer yanlış döndürürseniz, bu olaylarla ilgilenmediğiniz anlamına gelir ve diğer görüşlerin daha sonra bunları ele alma fırsatına sahip olacağı anlamına gelir. Yalnızca 1 görünümünüz olduğundan, yalnızca actionId denetimini yok saymanızı ve her seferinde yanlış döndürmenizi öneririm. Çakışan manzarası ya da kardeş görünümü varsa

etMovieName = (EditText) view.findViewById(R.id.et_movie_name); 
etMovieName.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView tv, int actionId, KeyEvent event) { 
     System.out.println("actionId= "+ actionId); 
     performSearch(); 
     return false; 
    } 
}); 

Diğer durum o zaman etrafında bilgi aktarmak için actionId kullanabilirsiniz vardır. Bu durumda, true olarak geri dönmek, diğer görünüme bilgi aktarmanıza izin verir. Eğer gerçekten durumunda ilgileniyorsanız (başka bir kardeş görünümü varsa örneğin)/actionId, o zaman bunu yapabilirsiniz: Eklediğim kez

etMovieName = (EditText) view.findViewById(R.id.et_movie_name); 

etMovieName.setImeOptions(EditorInfo.IME_ACTION_DONE); 
etMovieName.setSingleLine(); 

etMovieName.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView tv, int actionId, KeyEvent event) { 
     System.out.println("actionId= "+ actionId); 
     return performSearch();  } 
}); 

Bildirim actionId değeri 6'ya değişti:

etMovieName.setImeOptions(EditorInfo.IME_ACTION_DONE); 
etMovieName.setSingleLine(); 
+1

Çok tuhaf davranışlar var ama tam olarak doğru gözüküyorsun. –

İlgili konular