StackUseR
StackUseR

Reputation: 958

launch spinner on click of a button

I'm working on Xamarin android. I want a spinner to show up on a button click or the spinner should be on top of a button, the other way I can say. Sounds crazy but that's the stuff I got in my head a couple of days back! Yeah I've seen Spinner. May be what I'm asking is not part of the plan, but I wanna implement that!

UPDATE 2: Let me explain with an example.

Consider the Web 2.0 scientific calculator. There is a button π. You long press the button and you will get a drop down. The constant that you select from the drop down will be displayed in the textbox. I want the same functionality with the spinner. Just the difference is I want it on the button click rather than a long press. Hope I'm clear now.

That's the part of code I tried with:

<!--main.axml-->

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:id="@+id/myTitle">

            <!--some stuff-->

            <ImageButton android:onClick="onClick"
            android:id="@+id/btnPi"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight=".33"
            android:padding="100dip"
            android:src="@drawable/pi" /> 
      <Spinner
            android:onClick="onClick"
            android:id="@+id/btnConst"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight=".33"
            android:prompt="@string/cons" />

     <!--And few other stuffs-->
</LinearLayout>

<!--Strings.xml-->

<string name="cons">const</string>
  <string-array name="ConsArray">
    <item>Angstrom star</item>
    <item>Faraday constant</item>
    <item>Planck constant</item>
    <item>Rydberg constant</item>
    <item>Stefan-Boltzmann constant</item>
    <item>electric constant</item>
    <item>mag. constant</item>
    <item>neutron mass</item>
  </string-array>

It doesn't matter's to me whether I use a Button or a ImageButton ! I'm happy with either of it. Basically I just want a drop-down menu to popup, as soon as I click that button. Can anyone help me with this? Thanks in advance.

UPDATE: When I worked on York Shen's answer , I got this blank space occupied by the spinner: like this

Upvotes: 0

Views: 1222

Answers (2)

York Shen
York Shen

Reputation: 9084

I want a spinner to show up on a button click.

You could put a Button on Spinner by using a FrameLayout :

 <FrameLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent">
    <Spinner 
        android:id="@+id/spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:prompt="@string/planet_prompt"

    />
    <Button
        android:id="@+id/bt_spinner"
        android:text="Spinner Button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
    />
 </FrameLayout>

Then, every time your Button is click, you could use spinner.PerformClick() method to show your Spinner :

bt_spinner.Click += (sender, e) =>
{
    spinner.PerformClick();
};

Effect.

Update :

I cant reproduce your problem, but here is my complete code from the document, you could use it and try again :

spinner.ItemSelected += new EventHandler<AdapterView.ItemSelectedEventArgs>(spinner_ItemSelected);
var adapter = ArrayAdapter.CreateFromResource(this, Resource.Array.planets_array, Android.Resource.Layout.SimpleSpinnerItem);  

adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
spinner.Adapter = adapter;
bt_spinner.Click += (sender, e) =>
{
    spinner.PerformClick();
};

...

private void spinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
{
    Spinner spinner = (Spinner)sender;

    string toast = string.Format("The planet is {0}", spinner.GetItemAtPosition(e.Position));
    Toast.MakeText(this, toast, ToastLength.Long).Show();
}

Upvotes: 1

Slepz
Slepz

Reputation: 460

In your XAML, set the spinner to not be visible. In your onClick event, set change the visibility. You may have to do more in onClick if you want the things below the spinner in the linear layout to move out of the way.

Upvotes: 0

Related Questions