Spinner提供一种下拉列表选择,这种输入方式也是很常见的.比如选择语言,屏幕灭屏时间选择等.
按照之前介绍的其他组件一样,Spinner的实现也是首先在main.xml文件中添加一个按钮,单击此按钮会跳转到这个SpinnerActivity文件.
添加Button的代码如下所示:
<Button android:id = "@+/spinner_button"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Spinner"
/>
代码解释:
定义一个id为"Spinner_button"的按钮,并设定其宽度和高度是自适应,并指定其显示文字为"Spinner".
其对应的响应方法代码如下:
/*在activity中*/
private Button spinner_button;
spinner_button.setonClickListener(new onClickListener()
{
public onClick(View v)
{
Intent it = new Intent(MainActivity.this,SpinnerActivity.class);/*在activity中context可以用MainActivity.this */
startActivity(it);
}
});
=========-========
/*在fragment中*/
package com.example.spinner;
import android.app.Activity;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.content.Context;
public class MainActivity extends Activity {
private static Button spinner_button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
//liwei add
spinner_button = (Button)rootView.findViewById(R.id.spinner_button);
spinner_button.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
//Intent it = new Intent();
//it.setClass(getActivity(), SpinnerActivity.class);
Intent it = new Intent(getActivity(),SpinnerActivity.class);/*在fragment中context用getActivity()得到*/
startActivity(it);
}
}
);
return rootView;
}
}
}
代码解释:
在该Button被单击的时候,启动SpinnerActivity,这个SpinnerActivity就是用来展示Spinner组件的界面.
先创建SpinnerActivity这个Activity,然后修改其onCreate方法,设定其对应的模板为spinner.xml
实现代码如下:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setTitle("SpinnerActivity");
setContentView(R.layout.spinner);
}
代码解释:
首先使用setTile方法将其标题设置为"SpinnerActivity",并将Spinner.xml绑定为其模板文件.
新建其对应的模板文件spinner.xml,在其中添加一个TextView和一个Spinner组件,
实现代码如下:
<TextView
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:text = "Spinner_1"
/>
<Spinner
android:id = "@+id/spinner_1"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:drawSelectorOnTop = "false"
/>
这个模板文件中定义了一个TextView组件和一个Spinner组件.
接着在AndroidManifest.xml中添加如下代码:
<activity android:name = "SpinnerActivity"></activity>
代码解释:
这里定义的Spinner组件的id为spinner_1,宽度是占满其父元素(也就是LinearLayout)的宽,高度为自适应.
运行这个例子,可以看到如下图示.
可以看出界面已经显示了一个下拉组件,但是其中还没有任何数据.
下面就是实现往里面填一些数据,以便可以在列表数据中选择需要的数据.
给Spinner组件装填数据比较常见的有两种方式.
1)在编程的时候载入列表数据.
2)在xml文件中预先定义数据.
下面分别介绍两个方式:
1)在编程的时候载入列表数据
首先定义一下需要载入的数据,
具体代码如下:
private static final String[] mCountries = {"China","Russia","Germany","Ukraine","Belarus","USA"};
这里是提供了几个国家名称供选择,然后在onCreate中调用find_and_modify_view()来载入数据,
find_and_modify_view()的代码如下:
package com.example.spinner;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
public class SpinnerActivity extends Activity {
private static final String[] mCountries = {"China","Russia","Germany","Ukraine","Belarus","USA"};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setTitle("SpinnerActivity");
setContentView(R.layout.spinner);
find_and_modify_view();
}
private void find_and_modify_view()
{
Spinner spinner_choose = (Spinner)findViewById(R.id.spinner_sp);
ArrayList<String> allcountries = new ArrayList<String>();
for(int i=0;i<mCountries.length;i++)
{
allcountries.add(mCountries[i]);
}
ArrayAdapter<String> aspnCountries = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, allcountries);
aspnCountries.setDropDownViewResource(android.R.layout.simple_spinner_item);
spinner_choose.setAdapter(aspnCountries);
}
}
代码解释:
上述代码实现将定义的mCountries数据装载在Spinner 组件中,运行一下实例,可以看到如下效果.
2)在xml文件中预先定义数据.
除了上面那种在代码中指定Spinner 内容的方法外,还可以在xml文件中预先定义数据.
为了说明这个用法,在spinner.xml这个模板中在添加一个Spinner组件,实现代码如下:
<TextView android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Spinner_2 from arrays xml file"
/>
<Spinner android:id = "@+id/spinner_2"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:drawSelectorOnTop = "false"
/>
然后在SpinnerActivity.java中可以这样来初始化其值,实现代码如下:
spinner_2 = (Spinner)findViewById(R.id.spinner_2);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource {this,R.array.countries,android.R.layout.simple_spinner_item};
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner_2.setAdapter(adapter);
代码解释:
上述代码是将R.array.countries对应的值载入到Spinner_2中,而R.array.countries对应的值是在xml文件中预先定义的,其方法是在res/values/目录下新建一个名为array.xml的文件.
输入如下内容:
<?xml version="1.0" encoding="utf-8">
<resource>
<string-array name="countries">
<item>China2</item>
<item>Russia2</item>
<item>Germany2</item>
<item>Ukraine2</item>
<item>Belarus2</item>
<item>USA2</item>
</sting-array>
</resources>
代码解释:
在此文件中预先定义了一组名字为countries的数字(array),最后使用setDropDonnViewResource将其设置为Spinner_2的内容,运行程序可以看到如下效果.