16

分割されたActionBarがあり、GooglePlayの「Nowplaying」とほぼ同じ機能を追加しようとしています。

onCreateOptionsMenuを使用してメニュー項目を画面の下部に表示させることはできますが、actionBar.setCustomViewを使用すると、画面の下部にカスタムビューを表示することができないようです。カスタムビューは、上部のActionBarのすぐ下にあります。

カスタムビューを下に強制する方法、またはカスタムビューをonCreateOptionsMenuに追加する方法を知っている人はいますか?

これが私のコードのスニペットです:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayShowTitleEnabled(true);
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

    //Custom view to add
    actionBar.setCustomView(R.layout.albumitem);
            //This view shows up just under the top actionbar at the moment,
              despite menu items being at the bottom

メニューオプションコード:(これらは、カスタムビューを配置したい場所の下部に表示されています)

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    new MenuInflater(this).inflate(R.menu.option_menu, menu);

    return (super.onCreateOptionsMenu(menu));
}

グーグルプレイミュージックアプリの下部にある現在再生中のメニューは、分割アクションバー内のカスタムビューであると思います。

GooglePlayミュージック

4

2 に答える 2

17

だから私はこれに対する汚い解決策を見つけることができました..まあ、私のアマチュア的な意見では汚いです..

oncreateOptionsMenuで、option_menuというメニューを次のように膨らませました。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
        new MenuInflater(this).inflate(R.menu.option_menu, menu);

そして、そのoption_menuアイテムのxmlで、actionViewClassを実装しました。この場合、相対レイアウトを使用しました(View ..?を使用できたと思います)。

<item
    android:id="@+id/layout_item"
    android:actionViewClass="android.widget.RelativeLayout"
    android:showAsAction="always|withText"
    android:title="Text 1"/>

</menu>

そこで、xmlレイアウトを膨らませて、メニューで定義されているlayout_itemに追加しました。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        new MenuInflater(this).inflate(R.menu.option_menu, menu);
        relativeLayout = (RelativeLayout) menu.findItem(R.id.layout_item)
                .getActionView();

        View inflatedView = getLayoutInflater().inflate(R.layout.now_playing,
                null);

        relativeLayout.addView(inflatedView);

        return (super.onCreateOptionsMenu(menu));
    }

必要に応じて、この回答を自由に編集/拡張してください。

于 2012-08-16T04:05:18.887 に答える
1

上部のカスタムレイアウト+下部のカスタムレイアウト+タイトル/サブタイトル+ホームアイコンを含む、あなたのソリューションに基づいたソリューションを作成しました。コードは次のとおりです。

public class SplitABActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActionBar ab = getActionBar();
    ab.setTitle("Action Bar Title");
    ab.setSubtitle("Action Bar Subtitle");
    ab.setDisplayShowHomeEnabled(true);

    LayoutInflater inflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    RelativeLayout layout = (RelativeLayout) inflater.inflate(R.layout.ab_custom_layout, null);
    ab.setCustomView(layout);
    ab.setSplitBackgroundDrawable(new ColorDrawable(Color.BLUE));
    ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM  | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_including_layout, menu);
    RelativeLayout layout = (RelativeLayout) menu.findItem(R.id.layout_item).getActionView();
    View v = getLayoutInflater().inflate(R.layout.ab_bottom_layout, null);
    layout.addView(v); 

    return super.onCreateOptionsMenu(menu);
}
}

ab_custom_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="right"
    >
   <TextView android:id="@+id/element1" 
       android:layout_width="wrap_content" android:layout_height="wrap_content"
       android:textColor="#fff"
       android:background="#ff0000"
       android:text="Element 1"/>

   <TextView
       android:id="@+id/element2" 
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:textColor="#000"
        android:background="#f0f0f0"
        android:layout_toRightOf="@+id/element1"
       android:text="Element 2"/>

</RelativeLayout>

menu_include_layout.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:id="@+id/action1"
    android:title="Action 1"
      android:icon="@android:drawable/ic_dialog_alert"
      android:showAsAction="ifRoom" />

<item android:id="@+id/action2"
    android:title="Action 2"
      android:icon="@android:drawable/ic_dialog_info"
      android:showAsAction="ifRoom" />

<item
android:id="@+id/layout_item"
android:actionViewClass="android.widget.RelativeLayout"
android:showAsAction="always|withText"
android:title="Layout Item"/>
 </menu>

ab_bottom_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
 >

<TextView 
    android:id="@+id/bottom_layout_txt_status"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click this button"/>

<ImageButton android:id="@+id/bottom_layout_btn_chat"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/ic_menu_camera"
    android:layout_toRightOf="@+id/bottom_layout_txt_status"
    android:contentDescription="@string/app_name"/>
</RelativeLayout>

コードは私にぴったりです。タブレットを縦向きにすると、分割されたActionBarが表示されます。横向きでは、すべてのアイテムを上部に格納するのに十分な幅があります。

それが役に立てば幸い

于 2014-08-26T09:55:45.827 に答える