原创 Android第七站 众多豪华控件 RadioGroup 下拉菜单模式

2011-1-27 17:47 8044 6 6 分类: 智能手机

 

目录

4.6 向左或向右

RadioGroup组与onCheckedChanged事件

4.8 自定义下拉菜单模式

Spinner与setDropDownViewResource

4.9 动态添加/删除的Spinner菜单

 

 

4.6 向左或向右

RadioGroup组与onCheckedChanged事件

范例说明

接下来要介绍的是RadioGroup的组事件。RadioGroup可将各自不同的RadioButton设限于同一个Radio按钮组,同属一个RadioGroup组里的按钮,只能做出单一选择(单选题),虽然前一章曾经介绍过RadioGroup与RadioButton,但当时使用的是Button事件,在此要示范的是,“单击”的同时运行事件处理,而不再需要按钮(Button)的辅助了。

先设计一个TextView Widget,以及一个RadioGroup,并于该RadioGroup内放置两个RadioButton,默认为都不选择,在程序运行阶段,利用onCheckedChanged作为启动事件装置,让User在选择其中一个按钮时,显示被选择的内容,最后将RadioButton的选项文字显示于TextView当中。

范例程序

src/irdc.ex04_06/EX04_06.java

利用OnCheckedChangeListener来启动RadioGroup的事件,随后将被勾选的RadioButton(mRadio1.getText())的文字显示于TextView。

 

 

/* import程序略 */

 

public class EX04_06 extends Activity

{

  public TextView mTextView1;

  public RadioGroup mRadioGroup1;

  public RadioButton mRadio1,mRadio2;

  

  /** Called when the activity is first created. */

  @Override

  public void onCreate(Bundle savedInstanceState)

  {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    

    /*取得 TextView、RadioGroup、RadioButton对象*/

    mTextView1 = (TextView) findViewById(R.id.myTextView);

    mRadioGroup1 = (RadioGroup) findViewById(R.id.myRadioGroup);

    mRadio1 = (RadioButton) findViewById(R.id.myRadioButton1);

    mRadio2 = (RadioButton) findViewById(R.id.myRadioButton2);

     

    /*RadioGroup用OnCheckedChangeListener来运行*/

    mRadioGroup1.setOnCheckedChangeListener(mChangeRadio);

  }

  

  private RadioGroup.OnCheckedChangeListener mChangeRadio = new

           RadioGroup.OnCheckedChangeListener()

  {

    @Override

    public void onCheckedChanged(RadioGroup group, int checkedId)

    {

      // TODO Auto-generated method stub

      if(checkedId==mRadio1.getId())

      {

        /*把mRadio1的内容传到mTextView1*/

        mTextView1.setText(mRadio1.getText());

      }

      else if(checkedId==mRadio2.getId())

      {

        /*把mRadio2的内容传到mTextView1*/

        mTextView1.setText(mRadio2.getText());

      }      

    }

  };

}

 

 

扩展学习

在扩展学习里,请试着在其中加上两个Button,一个为回答,另一个为清除RadioButton的选择状态。程序有随机设置的答案选项,当User单击“回答”按钮时,比较答案是否正确。若正确,则以AlertDialog对话窗口显示答案结果。

 

answerButton.setOnClickListener(new Button.OnClickListener()

{

  public void onClick(View v)

  {

    new AlertDialog.Builder(TEST_56.this)

    .setIcon(R.drawable.icon)

    .setTitle(R.string.about_dialog_title)

    .setPositiveButton(R.string.about_dialog_ok, null)

    .setMessage(R.string.about_dialog_thanks)

    .create();

   {         

   }

  }).show();

}

 

 

在清除Button.onClickListener的事件处理中,只需将被选择的RadioButton取消掉,回到等待回答的状态。

 

mRadioGroup1.clearCheck();

 

 

4.8 自定义下拉菜单模式

Spinner与setDropDownViewResource

范例说明

Spinner就是下拉菜单,也等于swing的combo box、html的<select>,由于手机画面有限,要在有限的范围选择项目,下拉菜单是唯一、也是较好的选择。

Android提供的Spinner Widget的下拉菜单已经非常好用了,样式也还适用。但本范例的示范重点在于自定义下拉菜单里的样式,其关键在于调用setDropDownViewResource方法,以XML的方式定义下拉菜单要显示的模样。本范例除了自定义下拉菜单,还用程序设计了一段动画,当User以触控的方式单击这个自定义的Spinner时,会以一段动画提示User。

范例程序

src/irdc.ex04_08/EX04_08.java

在new ArrayAdapter中,我们将会使用ArrayAdapter(Context context, int textViewResourceId, T[] objects)这个Constructor,textViewResourceId使用Android提供的ResourceID,objects为必须传递的字符串数组(String Array)。

Adapter的setDropDownViewResource可以设置下拉菜单的显示方式,将该xml定义在res/layout目录下面,可针对下拉菜单中的TextView进行设置,如同本程序里的R.layout.myspinner_ dropdown即为自定义的下拉菜单TextView样式。除了改变下拉菜单样式外,也对Spinner做了一点动态效果,单击Spinner时,晃动Spinner再出现下拉菜单(myAnimation)。

 

/* import程序略 */

 

public class EX04_08 extends Activity

{

  private static final String[] countriesStr =

  { "北京市", "上海市", "天津市", "重庆市" };

  private TextView myTextView;

  private Spinner mySpinner;

  private ArrayAdapter<String> adapter;

  Animation myAnimation;

 

  /** Called when the activity is first created. */

  @Override

  public void onCreate(Bundle savedInstanceState)

  {

    super.onCreate(savedInstanceState);

    /*加载main.xml Layout */

    setContentView(R.layout.main);

 

    /* 以findViewById()取得对象 */

    myTextView = (TextView) findViewById(R.id.myTextView);

    mySpinner = (Spinner) findViewById(R.id.mySpinner);

 

    adapter = new ArrayAdapter<String>(this,

        android.R.layout.simple_spinner_item, countriesStr);

    /* myspinner_dropdown为自定义下拉菜单样式定义在res/layout目录下 */

    adapter.setDropDownViewResource(R.layout.myspinner_dropdown);

 

    /* 将ArrayAdapter添加Spinner对象中 */

    mySpinner.setAdapter(adapter);

 

    /* 将mySpinner添加OnItemSelectedListener */

    mySpinner.setOnItemSelectedListener

     (new Spinner.OnItemSelectedListener()

    {

      @Override

      public void onItemSelected

       (AdapterView<?> arg0, View arg1, int arg2,

          long arg3)

      {

        /* 将所选mySpinner的值带入myTextView中 */

        myTextView.setText("选择的是" + countriesStr[arg2]);

        /* 将mySpinner显示 */

        arg0.setVisibility(View.VISIBLE);

      }

 

      @Override

      public void onNothingSelected(AdapterView<?> arg0)

      {

        // TODO Auto-generated method stub

      }

    });

 

    /* 取得Animation定义在res/anim目录下 */

    myAnimation = AnimationUtils.loadAnimation(this, R.anim.my_anim);

 

    /* 将mySpinner添加OnTouchListener */

    mySpinner.setOnTouchListener(new Spinner.OnTouchListener()

    {

 

      @Override

      public boolean onTouch(View v, MotionEvent event)

      {

        /* 将mySpinner运行Animation */

        v.startAnimation(myAnimation);

        /* 将mySpinner隐藏 */

        v.setVisibility(View.INVISIBLE);

        return false;

      }

 

    });

 

    mySpinner.setOnFocusChangeListener(new Spinner.OnFocusChangeListener()

    {

      @Override

      public void onFocusChange(View v, boolean hasFocus)

      {

        // TODO Auto-generated method stub

      }

    });

  }

}

 

res/layout/myspinner_dropdown.xml

改变下拉菜单样子的XML,里面所使用的组件为TextView。

 

<?xml version="1.0" encoding="utf-8"?> 

<TextView

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

  android:id="@+id/text1" 

  android:layout_width="wrap_content" 

  android:layout_height="24sp" 

  android:singleLine="true"

  style="?android:attr/spinnerDropDownItemStyle" />

res/anim/my_anim.xml

Android的动画(Animation)是由4种类型(Type)所组成:alpha、scale、translate以及rotate,以下的自定义动画将使用其中的两种。

 

<?xml version="1.0" encoding="utf-8"?>

<set

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

  <translate

    android:fromXDelta="0"

    android:toXDelta="-100%p"

    android:duration="300"

  >

  </translate>

  <alpha

    android:fromAlpha="1.0"

    android:toAlpha="0.0"

    android:duration="300">

  </alpha>

</set>

扩展学习

Animation主要有两种动态方式,一种是tweened animation(渐变动画),另一种是frame by frame animation(画面转换动画)。tweened animation则有以下4种基本转换方式。

·  AlphaAnimation (transparency changes):透明度转换。

·  RotateAnimation (rotations):旋转转换。

·  ScaleAnimation (growing or shrinking):缩放转换。

·  TranslateAnimation (position changes):位置转换。

定义好你想要的动画XML后,用AnimationUtils.loadAnimation将动画加载,并试图在想要加上动态效果的组件中使用startAnimation方法。

4.9 动态添加/删除的Spinner菜单

范例说明

前面的范例对Spinner的自定义菜单、交互事件已大致掌握了设计方法,但在Android的Spinner里的元素,若要动态增减Spinner下拉菜单的选项,就必须利用ArrayList的依赖性来完成。

以下范例将设计一个EditText,当User输入了新的文字,在单击“添加”按钮的同时,就会将输入的值添加Spinner(至下拉菜单的最后一项),接着Spinner会停留在刚添加好的选项上;当单击“删除”按钮,则删除选择的Spinner选项,常应用于未知Spinner选项数量的To-Do List或添加维护市县数据等。

<!--[endif]-->

▲ 图4-9  随User的输入文字,可动态添加/删除的Spinner菜单

范例程序

src/irdc.ex04_09/EX04_09.java

Spinner添加了OnItemSelectedListener事件,当单击下拉菜单后,将值带到上方的Text- View。上一个范例在new adapter时传入String数组,这次因为要添加及删除adapter,所以要传入的是ArrayList,否则,在添加删除时会出现错误。

 

/* import程序略 */

 

public class EX04_09 extends Activity

{

  private static final String[] countriesStr =

  { "北京市", "上海市", "天津市", "重庆市" };

  private TextView myTextView;

  private EditText myEditText;

  private Button myButton_add;

  private Button myButton_remove;

  private Spinner mySpinner;

  private ArrayAdapter<String> adapter;

  private List<String> allCountries;

 

  /** Called when the activity is first created. */

  @Override

  public void onCreate(Bundle savedInstanceState)

  {

    super.onCreate(savedInstanceState);

    /*加载main.xml Layout */

    setContentView(R.layout.main);

 

    allCountries = new ArrayList<String>();

    for (int i = 0; i < countriesStr.length; i++)

    {

      allCountries.add(countriesStr);

    }

 

    /* new ArrayAdapter对象并将allCountries传入 */

    adapter = new ArrayAdapter<String>(this,

        android.R.layout.simple_spinner_item, allCountries);

    adapter

        .setDropDownViewResource

         (android.R.layout.simple_spinner_dropdown_item);

 

    /* 以findViewById()取得对象 */

    myTextView = (TextView) findViewById(R.id.myTextView);

    myEditText = (EditText) findViewById(R.id.myEditText);

    myButton_add = (Button) findViewById(R.id.myButton_add);

    myButton_remove = (Button) findViewById(R.id.myButton_remove);

    mySpinner = (Spinner) findViewById(R.id.mySpinner);

 

    /* 将ArrayAdapter添加Spinner对象中 */

    mySpinner.setAdapter(adapter);

 

    /* 将myButton_add添加OnClickListener */

    myButton_add.setOnClickListener(new Button.OnClickListener()

    {

 

      @Override

      public void onClick(View arg0)

      {

        String newCountry = myEditText.getText().toString();

 

        /* 先比较添加的值是否已存在,不存在才可添加 */

        for (int i = 0; i < adapter.getCount(); i++)

        {

          if (newCountry.equals(adapter.getItem(i)))

          {

            return;

          }

        }

 

        if (!newCountry.equals(""))

        {

          /* 将值添加到adapter */

          adapter.add(newCountry);

          /* 取得添加的值的位置 */

          int position = adapter.getPosition(newCountry);

          /* 将Spinner选择在添加的值的位置 */

          mySpinner.setSelection(position);

          /* 将myEditText清空 */

          myEditText.setText("");

        }

 

      }

    });

 

    /* 将myButton_remove添加OnClickListener */

    myButton_remove.setOnClickListener(new Button.OnClickListener()

    {

      @Override

      public void onClick(View arg0)

      {

        if (mySpinner.getSelectedItem() != null)

        {

          /* 删除mySpinner的值 */

          adapter.remove(mySpinner.getSelectedItem().toString());

          /* 将myEditText清空 */

          myEditText.setText("");

          if (adapter.getCount() == 0)

          {

            /* 将myTextView清空 */

            myTextView.setText("");

          }

        }

      }

    });

 

    /* 将mySpinner添加OnItemSelectedListener */

    mySpinner.setOnItemSelectedListener

    (new Spinner.OnItemSelectedListener()

    {

 

      @Override

      public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,

          long arg3)

      {

        /* 将所选mySpinner的值带入myTextView中 */

        myTextView.setText(arg0.getSelectedItem().toString());

      }

 

      @Override

      public void onNothingSelected(AdapterView<?> arg0)

      {

      }

    });

  }

}

 

扩展学习

setDropDownViewResource主要是设置User单击Spinner后出现的下拉菜单样式,除了前一个范例使用自设方式改变TextView内容之外,Android也提供两种基本的样式:

·  android.R.layout.simple_spinner_item:TextView的下拉菜单;

·  android.R.layout.simple_spinner_dropdown_item:除了有TextView,右边还有radio的下拉菜单。

查看Android 源代码中的simple_spinner_dropdown_item.xml,内容如下:

 

<?xml version="1.0" encoding="utf-8"?> 

<TextView 

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

  android:id="@android:id/text1"

  android:layout_width="fill_parent"

  android:layout_height="?android:attr/listPreferredItemHeight"

  android:singleLine="true"

  style="?android:attr/spinnerDropDownItemStyle"

/>

 

以下为自定义修改后,适用于spinner的Layout:

 

<?xml version="1.0" encoding="utf-8"?> 

<TextView

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

  android:id="@android:id/text1"

  android:layout_width="fill_parent"

  android:layout_height="12sp"

  android:singleLine="true"

  style="?android:attr/spinnerDropDownItemStyle"

  android:textSize="10sp"

/>

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条