android控件 RadioGroup 下拉菜单模式

目录

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[i]);

}

/* 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"

/>

你可能感兴趣的:(android,layout,dropdown,animation,button,RadioButton)