0

ユーザーがボタンに触れたときに「コンテキスト メニュー」を開きたいと思います。

オートフォーカスなしでデフォルトのAndroidコンテキストメニューを使用するソリューションを検索しましたが、成功しませんでした。私にとって、デフォルトのオートフォーカスは、ユーザーが (メニュー ウィンドウの外で) メイン ウィンドウで別の項目を選択するために余分なタップを強制するため、首の痛みです。

私のアクティビティは、項目g1g2、... を含むグリッドビューを提供し、コンテキスト メニューには、テキストエリアt1t2のリストが表示されます... 必要なものは次のとおりです。

  1. ユーザーがg1をタップすると、画面の下部にメニューが表示されます (基本的にメニュー レイアウトをカスタマイズできる必要があります)。
  2. ユーザーがg1をタップしても、ウィンドウの残りの部分はフェードアウトしません。つまり、下部のメニューが占めるスペースを除いて、メイン ウィンドウを通常どおり表示できるはずです。
  3. ユーザーがg1をタップしても、現在のウィンドウのフォーカスは失われません。つまり、メニューを開いた後に g2 をタップすると、g2は追加のタップを必要とせずに通常どおり動作します。
  4. ユーザーがg1をタップしてからg2をタップするとします。現在のコンテキスト メニューが閉じ、新しいコンテキスト メニューが開き、b2 用に更新されます。
  5. minsdkversion=8 から始まるアプリに対してそれを行う必要があります(「アクションバー」を使用できないようです)

これが理にかなっていることを願っています。そうでない場合はお知らせください。

デフォルトのコンテキスト メニューをハッキングして、このようにカスタマイズするのは面倒だと思いますか? 自作でも全然OKです。しかし、どこから始めればよいかわかりません。それで、私が望むものを達成する方向に私を向けてもらえますか?

御時間ありがとうございます

4

1 に答える 1

0

自己定義のコンテキスト メニューでそれを行う方法を 2 つ提案します。

バリアント A:おそらく、現在のレイアウトを にラップし、ユーザーが g1 をクリックするとすぐに(独自に定義したコンテキスト メニューを含む) をRelativeLayout追加するオプションです。g2 をクリックすると、その古いものを削除し、 で新しいものを追加します。LinearLayout を下部に配置するには、必ず on を使用して のインスタンスを渡し、Align Parent Bottom と Center Horizo​​ntal を設定します。yourは の最後の要素であるため、上に描画されます。フォーカスは思い通りに機能します。LinearLayoutRelativeLayoutLinearLayoutrelativeLayout.addView(contextMenuLayout)contextMenuLayout.setLayoutParams(...)RelativeLayout.LayoutParamscontextMenuLayoutRelativeLayout

バリアント B:LinearLayout現在のレイアウトを垂直方向にラップします。最初のセルには、現在のレイアウトが含まれています。2 番目のセルには、独自に定義したコンテキスト メニューを含めることができ、バリアント A と同様に追加および削除できます。2 つの利点: 1 つ目は、元のレイアウトがコンテキスト ビューでカバーされないため、すべてが常に表示されます。次に、「LinearLayout」を「animateLayoutChanges」に設定できます。これにより、コンテキスト メニューが Android API11+ でスムーズにフェードインします (以前のバージョンでは無視されていました)。

疑似コードとしてのバリアント A と B (どちらも同様に動作します):

class YourActivity extends Activity implements OnItemClickListener {

    View contextMenu = null;

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        // this could be RelativeLayout (Variant A) or LinearLayout (Variant B) which in turn contains your Layout
        Layout rootLayout = (Layout)findViewById(R.id.root_layout);

        // in case there is a context menu open, remove it
        if(contextMenu!=null)
            rootLayout.removeView(contextMenu);

        // add new self-defined context menu
        contextMenu = getContextMenuView();
        rootLayout.addView(contextMenu);
    }

    private View getContextMenuView() {
        Layout contextMenuView = new LinearLayout(...);
        .... add contents ...
        return contextMenuView;
    }

    ....
}

それ自体にはメソッドがないため、 rootLayout をLinearLayoutまたはにキャストする必要があることに注意してください。RelativeLayoutLayoutaddView(...)

于 2012-12-21T12:36:59.890 に答える