6

Nur versucht, meine App auf einem echten Gerät (HTC Desire Z mit Android 2.2) zu testen. Und festgestellt, dass meine Kontextmenüs auf EditText s überhaupt nicht funktioniert. Ansonsten funktioniert das Kontextmenü: in ListView, ImageView und so weiter. Auf dem Emulator funktioniert alles gut ...onCreateContextMenu() für EditText funktioniert nicht auf einem echten Gerät

Wenn ich auf EditText tippe, zeigt es so etwas wie Zoomrahmen und zeigt dann ein ungewöhnliches (nicht standardmäßiges Android ähnliches) Kontextmenü an, das lautet: "Text auswählen", "Alles auswählen". Es zeigt meine Menüs nicht an. Hier sind Screenshots:

  1. Before tap
  2. During tap
  3. After tap (nur gewöhnliche Text auswählen, wählen Sie alle, Paste)

aber nicht mein Menü wie in Emulator - look here

Hier ist der Quellcode meiner Aktivität:

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); 
    } 
} 

Ich habe gründlich alles um meinen Code debugged/protokolliert, aber noch Activity.onCreateContextMenu() nicht einmal aufgerufen (obwohl es ordnungsgemäß registriert ist).

Bitte helfen - was kann es sein? Handelt es sich um HTC Besonderheiten?

+0

Könnten Sie einen Screenshot des Kontextmenüs hochladen? – CommonsWare

+0

Ich bin auch neugierig auf einen Screenshot von dem, was Sie sehen. Ich habe ein originelles Desire und ich habe es gerade mit meinem Handy versucht und ich bekomme mein eigenes Kontextmenü mit Header Icon/Titel und meinen Auswahlmöglichkeiten, wenn ich meinen EditText lange drücke. – Squonk

+0

Sobald ich Zugriff auf USB-Debug-fähigen PC habe, werde ich Screenshots machen.Ich nehme an, es wird heute Abend passieren (von Moskau/Russland Zeit) – barmaley

Antwort

7

Ja, ich denke, was Sie sehen ein HTC-Menü gibt.

Das grafische Bearbeitungskontextmenü, das Sie sehen, ist, glaube ich, neu zu neueren Desire-Modellen (Desire HD und Desire Z). Was ich (mit Ihrem Code) auf meinem ursprünglichen Desire sehe, ist ein Popup-Text-basiertes Menü mit dem HeaderTitle als 'Text bearbeiten' und einer Liste wie 'Alles auswählen', 'Kopieren', 'Einfügen' usw. ABER, ich sehen Sie auch einen Eintrag mit dem Text "Testmenü".

Es kommt mir vor, dass wenn OnCreateContextMenu() für Dinge wie ListView und ImageView aufgerufen wird, das Objekt 'Menü', das an diesen Aufruf übergeben wird, nicht standardmäßig vorbelegt ist. Im Fall eines EditText ist es jedoch so konzipiert, dass es mit der Zwischenablage interagiert und als solches stellt das System ein vorab gefülltes Menü bereit, das auf dem Inhaltszustand des EditText basiert (z. B. wenn Text ausgewählt ist, eine "Kopieren" -Option bereitstellen; Wenn Text in der Zwischenablage vorhanden ist, bietet er eine 'Einfügen'-Option; ... und so weiter).

konnte ich ein Kontextmenü, ohne die ‚Bearbeiten‘ Optionen erhalten, indem die Header und Inhalte Clearing von Ihrem Code zu ändern ...

@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); 
} 

Die Tatsache, Sie ein grafisches Menü bekommen (möglicherweise abgeleitet von ContextMenu) schlägt vor, dass die obige Technik nicht funktioniert, so dass die einzige Möglichkeit darin besteht, Ihr eigenes ContextMenu-Objekt zu instanziieren, anstatt dasjenige zu verwenden, das an onCreateContextMenu() übergeben wurde.

ich gründlich ausgetestet haben/protokolliert alles um meinen Code, aber immer noch Activity.onCreateContextMenu() nicht einmal

genannt

Dies scheint sehr seltsam - offensichtlich ist es für mich gerufen, wie ich in der Lage gewesen sind um mit dem ContextMenu herumzuspielen, das ihm übergeben wird.

EDIT 1: Denken Sie darüber nach, Sie erwähnen, dass Sie den EditText "tippen" - ist das, was Sie tatsächlich tun (eine kurze Berührung und dann Finger hoch)?

Zu meinem ContextMenu Ich habe zu verwenden, um einen ‚langen‘ Presse/Klick zu bekommen (touch und für ca. 1 Sekunde lang gedrückt halten). Wenn ich einfach auf EditText tippe/berühre, erscheint die "Soft" -Tastatur oder, wenn die Tastatur bereits sichtbar ist, wird der Cursor einfach an eine andere Position im EditText-Feld bewegt.

Offensichtlich hat das Desire Z eine physische Tastatur und das kann etwas anderes Verhalten verursachen (ebenso wie das Desire Z eine andere Version der Sense UI zu meinem Wunsch hat).

Die Tatsache, dass onCreateContextMenu() nie für Sie aufgerufen wird, kann nur eine Sache bedeuten, und das was Sie sehen, ist KEIN ContextMenu und ist eine andere Art von Popup-UI-Element. Zumindest ist das der einzig logische Weg, um es zu verstehen.

Können Sie bestätigen, dass eine ‚lange‘ Presse noch keine ContextMenu für Sie nicht erstellen oder Sie haben die ganze Zeit einen langen Druck wurde unter Verwendung?

Wenn Sie eine lange drücken versucht haben, dann versuchen Sie den Code wie folgt zu ändern ...

  1. Implement OnClickListener

    public class MyActivity extends Activity 
        implements OnLongClickListener { 
    
  2. den Hörer für editText in onCreate Set ...

    @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. Fügen Sie den Listener-Code hinzu ...

    @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; 
        } 
    } 
    

Auf diese Weise, ich bin die Lage, den langen Druck abfangen und durch ‚true‘ aus onLongClick Rückkehr() Ich bin angibt, auf das System, das ich habe ‚verbraucht‘ das Ereignis und Es wird nicht weitergegeben, um die Erstellung meines ContextMenu zu verursachen.

Wenn dies für Sie nicht funktioniert und ein kurzes Antippen führt nach wie vor, dass Pop-up dann angezeigt werden, versuchen OnClickListener Implementierung und zwingenden onClick() statt.

Das Ziel der Übung ist, dass, wenn Sie abfangen können, was die Schaffung des Popup verursacht Sie sehen, können Sie dann Ihre eigene ContextMenu manuell erstellen und zeigen.

+0

Danke, ich werde deine Ideen überprüfen ... – barmaley

+0

Nein, es ruft nicht aufCreateContextMenu() - Ich habe alles doppelt überprüft. Bitte helfen Sie! Irgendwelche Ideen? – barmaley

+0

@barmaley: Siehe meine Antwort auf das Ende, wo ich EDIT 1: – Squonk

Verwandte Themen