1

Android 3.0以降にあるActionBarを多少エミュレートするAndroid 2.1専用のカスタムタイトルバーを作成しようとしています。

これまでのところ、かなり運が良かったのですが、ActionBar のアイコン/ボタンの下に表示されるドロップダウン リストを簡単に作成する方法が見つかりません。

これらのドロップダウン リストが、タイトル レイアウトとコンテンツ レイアウトの境界を、クリップ/カットオフされることなくクロスできるようにしたいと考えています。また、ドロップダウン リストを ActionBar のアイコン/ボタンよりも相対的に下に配置したいと考えています。FrameLayouts と RelativeLayouts を使用するようにというアドバイスを既に見ましたが、これらは私の問題を解決していないようです (私が間違っている場合を除きます)。Android の新しいバージョンはまさにこのタイプの動作をサポートしていると信じているので、それは可能であるに違いないと考え続けています。

これは、いくつかのメモで達成しようとしているもののスクリーンショットです。 http://img217.imageshack.us/img217/3279/67343249.png

助けてください。ありがとう!!!

4

3 に答える 3

0

これを行う最善の方法は、線形レイアウトを作成し、ドロップダウン リスト項目をその線形レイアウトに追加することだと思います。次に、ボタンのクリック時に線形レイアウトを追加し、相対レイアウト layoutparams を使用してボタンのすぐ下に表示します。

于 2012-04-18T06:49:37.293 に答える
0

数日間の調査の結果、これを実装する最良の方法は、listView を含むカスタム テーマでカスタム ダイアログ ボックスを使用することであることがわかりました。ユーザーがボタンをクリックすると、ボタンのすぐ下にダイアログが表示されます。これは優れたユーザー エクスペリエンスを提供し、この機能に対応するために基本的なレイアウト構造を完全に変更する必要がないことも意味します。(これは基本的に、ActionBar Sherlocke が後方互換性メニューに使用するのと同じアプローチです)

これは、私が説明しているもののコード スニペットです (これは Android 用の Mono を使用して C# で記述されていますが、Java に変換するのは簡単なはずです)。

Dialog dlgHome = new Dialog(this, Resource.Style.ActionBarMenu);
dlgHome.SetCanceledOnTouchOutside(true);
dlgHome.SetContentView(Resource.Layout.ActionBarMenu);
ListView lsvHome = (ListView)dlgHome.FindViewById(Resource.Id.lsvHome);
lsvHome.Adapter = new ArrayAdapter<string>(this, Resource.Layout.ActionBarMenuItem, new string[] { "Add Activity", "Edit Log", "Program Details" });

Rect r = new Rect();
btnHome.GetLocalVisibleRect(r);
int x = r.Left + (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 5, Resources.DisplayMetrics);
int y = r.Bottom;

WindowManagerLayoutParams param = dlgHome.Window.Attributes;
param.Gravity = (int)(GravityFlags.Top | GravityFlags.Left);
param.X = x;
param.Y = y;
dlgHome.Window.Attributes = param;

また、ここにスタイル xml があります (style.xml に含まれます)。

<style name="ActionBarMenu" parent="android:Theme.Dialog">
<item name="android:windowBackground">@color/actionbar_menu_bg</item>
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
于 2012-04-20T01:26:07.033 に答える
0

FrameLayoutでコンテンツを保持する必要があります。FrameLayout は複数の子を保持でき、互いにオーバーラップすることができます。

可能なレイアウト xml は次のようになります。

<FrameLayout>
    <LinearLayout android:margin_top="30dip">...</LinearLayout>
    <CustomActionBar />
</FrameLayout>

30dipActionBar の高さです。 で定義することをお勧めしますvalues。LienarLayout は、アプリケーション内の他のコンテンツを保持するためだけのものに置き換えることができます。

PS。FrameLayout が最初の子を最初にレンダリングするか最後にレンダリングするかはわかりません。linearlayout が customactionbar と重なっている場合は、それらの位置を入れ替えます。

=== 編集 ===

コードをよりきれいにするために、次の方法で行うことができます。

<CustomActionBar>
    <LinearLayout/>
</CustomActionBar>

カスタム アクション バーを、アクション バーを使用する xml レイアウトの「ルート」要素に置き換えました。カスタム アクション バーを実行するときは、それを から拡張しFrameLayout、それに応じて子のマージンを割り当てる必要があります。アイデアは、私が上で提示したものとほとんど同じです。

于 2012-04-18T02:02:06.990 に答える