2

I would like to add the same horizontal scrollable row of buttons like so

<HorizontalScrollView [...]>
  <LinearLayout [...] android:orientation="horizontal">
    <Button android:id="@+id/btn1" [..] />
    <Button [..] />
     [...] 
  </LinearLayout>
</HorizontalScrollView>

(toolbar.xml) to the bottom of every activity in my application. Rather than have to specify the click listeners for each button in every single activity, I'd like to be able to do all of that in one place and then just import the control each time. I figure I can do something like

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
 <com.example.ButtonBar android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:layout_alignParentBottom="true"
    android:layout_below="@+id/pagecontent" />
 <LinearLayout android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/pagecontent">

    <!-- the rest of each activity's xml -->

 </LinearLayout>

to include the button bar on the screen, and then do something like

package com.example;

import android.content.Context;
import android.content.Intent;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.HorizontalScrollView;

public class ButtonBar extends HorizontalScrollView implements OnClickListener
{

  public ButtonBar(Context context, AttributeSet attrs)
  {
    super(context, attrs);
    LayoutInflater inflater = 
        (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.toolbar, null);

    Button btn1 = (Button) view.findViewById(R.id.button1);
    btn1.setOnClickListener(this);

    // and so on for the rest of the buttons

    addView(View);
  }

  @Override
  public void onClick(View v)
  {
    Intent intent = null;

    if (v.getId() == R.id.btn1)
    {
      intent = new Intent(getContext(), FirstScreen.class);
    }
    else if  (v.getId() == R.id.btn2)
    {
      intent = new Intent(getContext(), SecondScreen.class);
    }
    // and so on

    if (intent != null) getContext().startActivity(intent);     
  }    
}

but then what? How do I actually get it to display? Are there other methods I should be overriding? Is there a better / more appropriate way of doing this?

Ben Williams
  • 6,027
  • 2
  • 30
  • 54
  • You can certainly do what you're describing and a quick look over reveals no mistakes (although in one place your control is called `com.example.ToolBar` and elsewhere `com.example.ButtonBar`). Inheriting from a basic control is a great approach as it implements all the required behavior of the control. Re. "How do I actually get it to display", have you tried it? Why don't you think this will result in the custom control being displayed? – Jim Blackler Apr 22 '11 at 15:03
  • 1
    Mostly because when I run it, it doesn't show up. – Ben Williams Apr 22 '11 at 15:11
  • Yes, that's all. You might want to create a special click listener for your custom view, so that you can specify inside the activity what the buttons need to do, if their function changes. It would be also more clean IMHO. – bigstones Apr 22 '11 at 15:13
  • 1
    what does hierarchy viewer have to say about it? – bigstones Apr 22 '11 at 15:21
  • @bigstones: good call! The hierarchy viewer shows the button bar is definitely being added to the screen, but off the bottom, so my xml must be wrong somewhere. – Ben Williams Apr 22 '11 at 16:07

1 Answers1

5

Take a look at a custom control ProgressView in my app BBC News, and one layout that uses it.

http://svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/src/net/jimblackler/newswidget/ProgressView.java

http://svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/res/layout/progress_view.xml

http://svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/res/layout/main.xml

Jim Blackler
  • 22,946
  • 12
  • 85
  • 101