3

我想创建一个自定义底部按钮栏布局,我创建了一个 xml 文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@android:style/ButtonBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="0dp" >

<Button
    android:id="@+id/media_menu_button"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_margin="0dp"
    android:layout_weight="1"
    android:text="@string/media_menu_button" />

<Button
    android:id="@+id/scenario_menu_button"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_margin="0dp"
    android:layout_weight="1"
    android:text="@string/scenario_menu_button" />

 <Button
    android:id="@+id/rooms_menu_button"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_margin="0dp"
    android:layout_weight="1"
    android:text="@string/rooms_menu_button" />

<Button
    android:id="@+id/shortcut_menu_button"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_margin="0dp"
    android:layout_weight="1"
    android:text="@string/shortcut_menu_button" />

如您所见,我已将所有按钮的宽度设为 0dp,重量为 1。然后,我创建了一个扩展线性布局类的类:

public class BeLightBottomBar extends LinearLayout implements OnClickListener {
private LayoutInflater mInflater; 
private Context contexnt;

private Button mShortcutMenuButton;

private Button mRoomsMenuButton;

private Button mScenarioMenuButton;

private Button mMediaMenuButton;

public BeLightBottomBar(Context context, AttributeSet attrs) {
    super(context, attrs);

    //inflate the view
    this.contexnt = context;
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    LinearLayout barView = (LinearLayout) mInflater.inflate(R.layout.belight_bottombar, null);
    addView(barView);

    //get all the instances of the components of the bar
    mShortcutMenuButton = (Button) barView.findViewById(R.id.shortcut_menu_button);
    mRoomsMenuButton = (Button) barView.findViewById(R.id.rooms_menu_button);
    mScenarioMenuButton = (Button) barView.findViewById(R.id.scenario_menu_button);
    mMediaMenuButton = (Button) barView.findViewById(R.id.media_menu_button);

    //set this as a click listener
    mShortcutMenuButton.setOnClickListener(this);
    mRoomsMenuButton.setOnClickListener(this);
    mScenarioMenuButton.setOnClickListener(this);
    mMediaMenuButton.setOnClickListener(this);
    ... 
    ...
    ...
  }

问题是当我将此类添加到主要活动 xml

<belight.homecontrol.components.BeLightBottomBar
    android:id="@+id/button_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_margin="0dp"
    android:padding="0dp" />

重量停止工作,所有按钮都不同。我不知道为什么!?如果我只是将底部的 bar xml 代码复制粘贴到主 xml 文件中,它可以正常工作,只有在整体使用时才会出现问题。

PS以这种方式创建组件是一种好习惯吗?或者也许我做错了什么?

谢谢,丹

4

2 回答 2

2

嗯,我从来没有见过这样的布局。它可能会发生一些奇怪的事情,请尝试使用这种单行方法:

//inflate the view
this.contexnt = context;
LayoutInflater.from(context).inflate(R.layout.belight_bottombar, this);

//get all the instances of the components of the bar
....

这就是我用于任何自定义组件的内容。我已经做了很多这样附加权重的线性布局,所以应该没有任何问题。使它读起来也更干净,因为它将三行减为一。

于 2012-09-11T02:02:37.323 回答
0

在 addView 上通过 LinearLayout.LayoutParams 和 FILL_PARENT 在 layoutWidth 上。

于 2012-09-10T22:00:16.540 回答