6

Po prostu próbowałem przetestować moją aplikację na prawdziwym urządzeniu (HTC Desire Z z systemem Android 2.2). Okazało się, że moje menu kontekstowe nie działa w ogóle na EditText s. W przeciwnym razie menu kontekstowe działa: w ListView, ImageView i tak dalej. Na emulatorze wszystko działa dobrze ...onCreateContextMenu() dla EditText nie działa na prawdziwym urządzeniu.

Kiedy klikam na EditText, pokazuje się coś w rodzaju ramki powiększenia, a następnie pokazuje nietypowe (nie standardowe menu systemu Android) menu kontekstowe, które brzmi: "wybierz tekst", "wybierz wszystko". Nie pokazuje mojego menu. Oto zrzuty ekranu:

  1. Before tap
  2. During tap
  3. After tap (tylko zwykły Zaznacz tekst, wybrać wszystkie, pasta)

ale nie mój menu jak w emulatorze - look here

Oto kod źródłowy mojej aktywności:

public class MyActivity extends Activity 
{ 
    private static final String TAG=MyActivity.class.getName(); 

    EditText editText; 
    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     editText=(EditText)findViewById(R.id.editText); 
     this.registerForContextMenu(editText); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) 
    { 
     Log.v(TAG, "Creating context menu for view="+view); 
     menu.add(Menu.NONE, Menu.FIRST+1, Menu.NONE, "Test menu"); 
     super.onCreateContextMenu(menu, view, menuInfo); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) 
    { 
     Log.v(TAG, "Context item selected as="+item.toString()); 
     return super.onContextItemSelected(item); 
    } 
} 

Mam dokładnie debugowane/rejestrowane wszystko wokół mojego kodu, ale nadal Activity.onCreateContextMenu() nawet nie wywoływana (choć jest zarejestrowana we właściwy sposób).

Pomóż - czym może być? Czy dotyczy to osobliwości HTC?

+0

Czy możesz opublikować zrzut ekranu menu kontekstowego? – CommonsWare

+0

Jestem również ciekawy zrzutu ekranu z tego, co widzisz. Mam oryginalny Desire i właśnie wypróbowałem to z moim telefonem i poprawnie dostaję moje własne menu kontekstowe z ikoną nagłówka/tytułu i moimi wyborami, kiedy długo naciskam mój EditText. – Squonk

+0

Jak tylko będę miał dostęp do komputera obsługującego debugowanie USB, wykonam zrzuty ekranu.Przypuszczam, że stanie się to dzisiaj wieczorem (czasu moskiewsko-rosyjskiego) – barmaley

Odpowiedz

7

Tak, myślę, że to, co widzisz tam jest menu HTC.

Widoczne menu kontekstowe edycji graficznej jest, jak sądzę, nowym dla nowszych modeli Desire (Desire HD i Desire Z). To, co widzę (z twoim kodem) na moim oryginalnym Desire, to menu podręczne z ustawieniem HeaderTitle jako "Edit text" i lista taka jak "Select all", "Copy", "Paste" itd. ALE, I zobacz także wpis z napisem "Menu testu".

Wydaje mi się, że po wywołaniu metody onCreateContextMenu() w takich obiektach, jak ListView i ImageView, obiekt "menu" przekazany do tego połączenia nie jest domyślnie wypełniany. W przypadku wyłączenia EditText jest on jednak zaprojektowany do interakcji ze Schowkiem i jako taki dostarcza wstępnie wypełnione menu oparte na stanie zawartości EditText (np. Jeśli zaznaczono tekst, należy podać opcję "Kopiuj"; jeśli tekst w schowku zawiera opcję "Wklej", ... itd.).

udało mi się dostać do menu kontekstowego bez opcji „edytuj” czyszcząc nagłówek i treść modyfikując swój kod ...

@Override 
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) 
{ 
    Log.v(TAG, "Creating context menu for view="+view); 

    // Clear current contents 
    menu.clearHeader(); 
    menu.clear(); 

    menu.setHeaderTitle("TEST MENU"); 
    menu.add(Menu.NONE, Menu.FIRST+1, Menu.NONE, "Test menu"); 
    super.onCreateContextMenu(menu, view, menuInfo); 
} 

Fakt dostajesz menu graficznego (prawdopodobnie pochodzi z ContextMenu) sugeruje, że powyższa technika nie zadziała, więc jedyną metodą jest utworzenie instancji własnego obiektu ContextMenu zamiast użycia obiektu onCreateContextMenu().

Mam dokładnie debugowany/zalogowany wszystko wokół mojego kodu, ale nadal Activity.onCreateContextMenu() nawet nie nazywa

To wydaje się bardzo dziwne - oczywiście to miano dla mnie jak udało mi bawić się z ContextMenu, które jest do niego przekazywane.

EDIT 1: Ponownie przemyślając to, wspominasz, że "puknij" w EditText - czy to właśnie robisz (krótkie dotknięcie, a następnie podniesienie palca)?

Aby dostać moje ContextMenu, muszę użyć "długiego" naciśnięcia/kliknięcia (dotknij i przytrzymaj przez około 1 sekundę). Kiedy po prostu dotknę/dotknę mojego EditText pojawi się "miękka" klawiatura lub, jeśli klawiatura jest już widoczna, kursor zostanie po prostu przesunięty w inne miejsce w polu EditText.

Oczywiście Desire Z ma fizyczną klawiaturę, która może powodować nieco inne zachowanie (podobnie jak Desire Z ma inną wersję interfejsu Sense UI do mojego Desire).

Fakt, że metoda onCreateContextMenu() nigdy nie jest wywoływana, może oznaczać tylko jedną rzecz, a mianowicie to, co widzisz NIE jest ContextMenu i jest innym elementem popup elementu interfejsu użytkownika. Przynajmniej to jest jedyny logiczny sposób, w jaki mogę go zrozumieć.

Czy możesz potwierdzić, że "długie" naciśnięcie wciąż nie tworzy dla Ciebie Menu kontekstowego lub czy używasz długiego naciśnięcia od początku?

Jeśli próbowałeś długie naciśnięcie następnie spróbuj modyfikacji kodu następująco ...

  1. Wdrożenie OnClickListener

    public class MyActivity extends Activity 
        implements OnLongClickListener { 
    
  2. Ustaw słuchacza do EditText w onCreate ...

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        editText=(EditText)findViewById(R.id.editText); 
        this.registerForContextMenu(editText); 
        editText.setOnLongClickListener(this); // <-- ADD THIS 
    } 
    
  3. Dodaj kod odbiornika ...

    @Override 
    public boolean onLongClick(View arg0) { 
        android.util.Log.v(TAG, "onLongClick() called"); 
        if (arg0 == editText) 
        { 
         android.util.Log.v(TAG, "arg0 == editText"); 
          Toast.makeText(this, "onLongClick intercepted", 2000).show(); 
         return true; 
        } 
        else 
        { 
         android.util.Log.v(TAG, "arg0 != editText"); 
         return false; 
        } 
    } 
    

Dzięki temu jestem w stanie przechwycić i naciśnij długo, wracając „true” z onLongClick() Jestem wskazuje systemowi, że mam „konsumowane” zdarzenia i nie zostanie przekazany, aby spowodować utworzenie mojego ContextMenu.

Jeśli to nie działa, a krótkie naciśnięcie powoduje wyświetlenie tego okienka, spróbuj zaimplementować OnClickListener i zastąpić onClick().

Celem ćwiczenia jest to, że jeśli możesz przechwycić wszystko, co powoduje powstanie wyskakującego okienka, możesz ręcznie utworzyć i pokazać własne menu kontekstowe.

+0

Niż sprawdzę twoje pomysły ... – barmaley

+0

Nie to nie wywołuje onCreateContextMenu() - Mam podwójnie sprawdzone wszystko. Proszę pomóż! Jakieś pomysły? – barmaley

+0

@barmaley: Zobacz moją odpowiedź pod koniec, od czego zaczynam EDYT 1: – Squonk

Powiązane problemy