7

実際のデバイス (Android 2.2 を搭載した HTC Desire Z) でアプリをテストしようとしました。そして、コンテキスト メニューが s でまったく機能しないことがわかりましたEditText。それ以外の場合は、コンテキスト メニューが機能します: inListViewなどImageView。エミュレーターではすべて正常に動作します...

EditTextをタップすると、ズームフレームのようなものが表示され、「テキストを選択」、「すべてを選択」という珍しい(標準のAndroidとは異なる)コンテキストメニューが表示されます。メニューが表示されません。スクリーンショットは次のとおりです。

  1. タップ前
  2. タップ中
  3. タップ後(普通にテキスト選択、全選択、貼り付け)

しかし、エミュレータのような私のメニューはありません -ここを見てください

私の活動のソースコードは次のとおりです。

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

コードの周りのすべてを徹底的にデバッグ/ログに記録しましたが、まだ Activity.onCreateContextMenu() は呼び出されていません (適切な方法で登録されています)。

助けてください - それは何ですか?それは HTC の特性に関連していますか?

4

2 に答える 2

7

はい、私はあなたが見ているものはHTCメニューがあると思います。

表示されているグラフィカルな編集コンテキストメニューは、最近のDesireモデル(DesireHDおよびDesireZ)の新機能だと思います。元のDesireで(コードとともに)表示されるのは、HeaderTitleが「テキストの編集」に設定されたポップアップテキストベースのメニューと、「すべて選択」、「コピー」、「貼り付け」などのリストです。しかし、私は「テストメニュー」というエントリも表示されます。

ListViewやImageViewなどに対してonCreateContextMenu()が呼び出された場合、その呼び出しに渡された'menu'オブジェクトはデフォルトで事前入力されていません。ただし、EditTextを使用しない場合は、クリップボードと対話するように設計されているため、システムはEditTextのコンテンツ状態に基づいて事前入力されたメニューを提供します(たとえば、テキストが選択されている場合は、[コピー]オプションを提供します。クリップボードにテキストがある場合は、「貼り付け」オプションを指定します; ...など)。

コードを変更してヘッダーとコンテンツをクリアすることで、「編集」オプションなしでコンテキストメニューを取得できました...

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

グラフィカルメニュー(おそらくContextMenuから派生)を取得しているという事実は、上記の手法が機能しないことを示唆しているため、onCreateContextMenu()に渡されたオブジェクトを使用するのではなく、独自のContextMenuオブジェクトをインスタンス化するのが唯一の方法です。

コード周辺のすべてを徹底的にデバッグ/ログに記録しましたが、Activity.onCreateContextMenu()は呼び出されませんでした

これは非常に奇妙に思えます。渡されたContextMenuをいじくり回すことができたので、明らかに私に呼び出されています。

編集1:これを再考すると、あなたはEditTextを「タップ」すると言います-それはあなたが実際に行っていることです(短いタッチダウンと指のアップ)?

ContextMenuを取得するには、「長押し」を使用する必要があります(約1秒間押し続けます)。EditTextをタップ/タッチするだけで、「ソフト」キーボードが表示されます。キーボードがすでに表示されている場合は、カーソルがEditTextボックスの別の位置に移動するだけです。

明らかに、Desire Zには物理的なキーボードがあり、それによってわずかに異なる動作が発生する可能性があります(また、DesireZのSenseUIのバージョンは私のDesireとは異なります)。

onCreateContextMenu()が呼び出されないという事実は、1つのことだけを意味する可能性があります。つまり、表示されているのはContextMenuではなく、他のタイプのポップアップUI要素です。少なくともそれが私が理解できる唯一の論理的な方法です。

「長押し」してもコンテキストメニューが作成されないこと、または長押しをずっと使用していたことを確認できますか?

長押しを試した場合は、次のようにコードを変更してみてください...

  1. OnClickListenerを実装する

    public class MyActivity extends Activity
        implements OnLongClickListener {
    
  2. onCreate..でeditTextのリスナーを設定します。

    @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. リスナーコードを追加します...

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

これを行うことで、長押しをインターセプトすることができ、onLongClick()から「true」を返すことで、イベントを「消費」したことをシステムに示していますが、イベントは発生しません。 ContextMenuの作成。

これがうまくいかず、短くタップしてもポップアップが表示される場合は、代わりにOnClickListenerを実装し、onClick()をオーバーライドしてみてください。

演習の目的は、表示されているポップアップの作成の原因となっているものをすべて傍受できる場合は、手動で独自のContextMenuを作成して表示できることです。

于 2010-12-11T01:05:25.430 に答える
-1

これは、表示されている標準のカット/コピー/貼り付けメニューです。

詳細については、次のトピックを参照してください。

コピー&ペースト用の独自のコンテキストメニューを作成するにはどうすればよいですか?

よろしくHJW

于 2010-12-10T07:07:03.160 に答える