Frage

Just versucht, meine app auf reales Gerät (HTC Desire Z mit Android 2.2) zu testen. Und festgestellt, dass meine Kontextmenüs nicht auf EditTexts überhaupt nicht funktionieren. Ansonsten Kontextmenüs Werke: in ListView, ImageView und so weiter. Auf Emulator funktioniert alles einwandfrei ...

Wenn ich auf EditText tippen zeigt es so etwas wie Zoom-Rahmen und dann ungewöhnlich zeigt (nicht Standard-Android gleichermaßen) Kontextmenü, das lautet: „Text auswählen“, „alle auswählen“. Es zeigt nicht meine Menüs. Hier sind Screenshots:

  1. Bevor tippen
  2. Während tippen
  3. Nach tippen (nur gewöhnlichem Text auswählen, alle auswählen, einfügen)

aber nicht mein Menü wie in Emulator - hier

Hier ist Quellcode meiner Tätigkeit:

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 ausgetestet / protokollierte alles um meinen Code, aber immer noch Activity.onCreateContextMenu () nicht einmal genannt (obwohl es in der richtigen Art und Weise registriert ist).

Bitte Hilfe - was kann es sein? Ist es wichtig für HTC Besonderheiten zu tun?

War es hilfreich?

Lösung

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

Die grafische bearbeiten Kontextmenü Sie sehen, ist, glaube ich, neue neueren Wunsch Modelle (Desire HD und Desire Z). Was ich sehe, (mit Code) auf meinem ursprünglichen Wunsch ist ein Popup-Textmenü mit dem Satz als header ‚Edit Text‘ und einer Liste wie ‚Alles auswählen‘, ‚Kopieren‘, ‚Einfügen‘ usw. ABER, ich Sie auch einen Eintrag sehen sagen: ‚Test-Menü‘.

Es fällt mir, dass, wenn onCreateContextMenu () für Dinge wie Listview und Image genannt wird, das ‚Menü‘ Objekt übergeben in diesem Ruf ist nicht standardmäßig vorgefüllt. Im Fall aus einem EditText jedoch ist es entworfen, mit der Zwischenablage und als solche dem System zu interagieren ist ein Pre-besiedeltes Menü basierend auf dem Inhalt staatliches EditText Bereitstellung (zB wenn Text ausgewählt ist, bietet eine ‚Kopie‘ Option; wenn es Text in der Zwischenablage stellt 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, dass Sie ein grafisches Menü sind immer (möglicherweise von ContextMenu abgeleitet) schlägt vor, die obige Technik nicht funktionieren, so der einzige Weg, um es wäre Ihr eigenes Objekt ContextMenu eher derjenige als die Verwendung instanziiert zu onCreateContextMenu übergeben ( ).

  

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

Das scheint sehr seltsam -. Natürlich ist es für mich gerufen, wie ich in der Lage gewesen, mit dem ContextMenu zu spielen, um die an sie übergeben wird

EDIT 1: neu denken diese, die Sie erwähnen, dass Sie tippen Sie auf "die EditText - ist das, was Sie eigentlich tun (eine kurze Aufsetzpunkt dann Finger nach oben)

Zu meiner ContextMenu Ich habe zu verwenden, um einen ‚langen‘ drücken / klicken (Touch und halten für ca. 1 Sekunde) zu erhalten. Wenn ich einfach Hahn / berühren meine EditText die ‚weiche‘ Tastatur erscheint oder, wenn die Tastatur bereits sichtbar ist, wird der Cursor einfach an eine andere Position in dem EditText Feld bewegt.

Offensichtlich ist das Desire Z hat eine physische Tastatur und das kann leicht unterschiedliches Verhalten verursachen (wie auch das Desire Z eine andere Version der Sense UI meinen Wunsch hat).

Die Tatsache, dass onCreateContextMenu () nie aufgerufen wird für Sie nur eins bedeuten kann, und das ist, was Sie sehen, ist nicht ein ContextMenu und ist eine andere Art von Pop-up-UI-Element. Mindestens das ist der einzige logische Weg ich es verstehen kann.

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 mit?

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

  1. Implementieren OnClickListener

    public class MyActivity extends Activity
        implements OnLongClickListener {
    
  2. Stellen Sie den Hörer für editText in 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. Fügen Sie den Hörer Code ...

    @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 Rückkehr ‚true‘ aus onLongClick () Ich bin angibt, an dem System, dass ich ‚verbraucht‘ das Ereignis und es nicht übergeben bekommt auf die Schaffung meiner ContextMenu zu führen.

Wenn dies nicht funktioniert für Sie und einen kurzen Hahn immer noch, dass Pop-up verursacht, dann zu erscheinen versuchen OnClickListener Implementierung und zwingenden onClick () statt.

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

Andere Tipps

Es ist der Standard Ausschneiden / Kopieren / Einfügen-Menü Sie sehen.

Sehen Sie dieses Thema für weitere Informationen:

Wie kann ich meine eigenen Kontext schreiben Menü für copy & Paste?

Viele Grüße HJW

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top