Android学习笔记(十二):Activity-Spinner

Spinner这个词可能有些陌生,在Java中,就是ComboBox。下面我们通过两个例子来学习。两个例子本质上没有区别,但是我们学习一下一些细节的变化。

在学习之前,换个思考,想一下下面这个虚拟案例的判决(这是听来的)

洞穴奇案的判例

  洞穴奇案:这是一个虚构的案例,原型是海难吃人案,但是做更多的理清。5个人在洞穴探险中发生意外,等待救援。而食品无法维持足够的时间,除非人相食。更过讨论,决定采用几率均等的抽签(或者骰子)方式。在抽签前,某人反悔,不愿进行。但是其他人不同意,有另一人替他抽签,而某人也同意了。结果就是某人作为牺牲。获救后,另外4个人被以谋杀起诉,事情的过程清晰明了,如何判据。

法官A:

  故意杀人,谋杀成立,但是由于案情太特殊,将向最高机构申请豁免。维护了法律尊严,也伸张的公正。

法官B:

  对于法官A,若然透过其他手段才能伸张公正,何来法律尊严,要在法律的框架中解决这个问题。
1、    法例的订立的前提是无须剥夺他人的生命,在这个案子中,这个前提不存在,当时助于自然状态,以相吃维存生命。
2、    刑法立法精神在于阻止他人犯罪,在这个案子中,如果判罚有罪,在同样的环境下,并无阻吓做作用,不会因此而不杀人。

法官C:

  对于法官B:
1、    法官向法律宣誓而执行法律,并没有向自然法宣誓,并不具备解释自然法的权利,因此只能根据现有法律来判决;
2、    如果这个合法,如果过程合法,由于牺牲者的反抗导致其他人员的伤亡,则牺牲者是违法的,这给推论是荒谬的。
3、    刑法立法的目的除了阻吓作用之外,还有对行为的纠正。
    一个类似的案例,如果人快饿死,而偷面包,也是有罪的。因此有罪。

法官D:
  对于法官A:越权,法官无权去指示其他人去进行豁免,
  法官是宣誓执行法律而非执行道德,根据法律进行判案,是没有立法的权利,如果条文已经清晰覆盖案例,就应知足法规。案情无任何含糊地方,无任何理由免罪。

法官E:
  本案涉及人类智慧如何在案件中实践的问题,于抽象的理论无法。执行法律在于处理社会的事务,社会的人不是会抽象的条目所统治,所谓法官不能脱离现实,取向不能与民意脱离太远。这案件中,跟随民意作出免罪判罚。

法官F:
  司法独立不应受外界影响,民众有的是立法权,否则回复希腊城邦,通过人投票表决。

例子一:Spinner的基本实现方法

步骤一:编写Android XML文件

<LinearLayout …… >
  <TextView android:id="@+id/spinner_label" …… />
   <!-- 经过我们的测试android:drawSelectorOnTop="true | false"不起作用,因此此参数可以不设置 (补注明:网友insiku:不起作用是因为默认的selector是透明的, 你可以用一张不透明的图片setSelector )-->
   <Spinner android:id="@+id/spinner"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"  />
</LinearLayout>

步骤二:源代码

1)设置Spinner之中的元素内容,采用了ArrayAdapter来描述,并通过setApdater()来设置adapter

private String[] items=   {"lorem", "ipsum", "dolor", "sit", "amet",….
ArrayAdapter<String> aa = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,items);//第二个参数表示spinner没有展开前的UI类型
spin.setAdapter(aa); //之前已经通过Spinner spin = (Spinner) findViewById(R.id.spinner);来获取spin对象

2)设置spinner展开的方式,在上面,我们将通过设置ArrayAdapter的第二个参数,设置了spinner没有展开前的UI格式,simple_spinner_item是textview的label方式,而simple_spinner_dropdown_item这是点击圆圈选择方式。在这个例子中,我们将展开方式设置为点击圆圈选择,如图所示。关于格式,我们会在第二个例子中进行试验。

aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

3)使用setOnItemSelectedListener()来设置Spinner的点击触发的callback函数,有onItemSelected和onNothingSelected两个接口需要具体给出。

public class SpinnerTest extends Activity implements OnItemSelectedListener{

   protected void onCreate(Bundle savedInstanceState) {
        ……
        spin.setOnItemSelectedListener(this);
        … …
    }
    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,  long arg3) {
        // TODO Auto-generated method stub
        label.setText(items[arg2]); //label是我们设置的第一个TextView widget,arg2就是元素的pos需要
       
    }
    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub
        label.setText("");
    }      
}

例子二:Spinner的UI格式

步骤一:编写Android XML文件

在例子来自Android官方网站的tutorial的例子。我们下载SDK的文档中也带有,可以本地查看。这里我们希望item的元素内容设置都在XML中定义,方便修改以及多国语言版本的实现。

在strings.xml中:

<resources>
    <string name="planet_prompt">太阳系行星:</string>
    <string-array name="planets_arry">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
        <item>Mars</item>
        <item>Jupiter</item>
        <item>Saturn</item>
        <item>Uranus</item>
        <item>Neptune</item>
    </string-array>
</resources>

在layout的xml中:

<LinearLayout … >
  <TextView … />
  <Spinner android:id="@+id/spinner4"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:prompt="@string/planet_prompt" />
</LinearLayout>

在Spinner中,我们设置了prompt,根据@string在strings.xml中查找,prompt的内容为“太阳系行星:”在我们点击展开Spinner中,我们可以看到在最上面增加了提示,如上图所示。

步骤二:编写源代码

1)设置spinner的adapter,并导入数据,以及设置UI格式。

Spinner spin=(Spinner)findViewById(R.id.spinner4);
//createFromResouce将返回ArrayAdapter<CharSequence>,具有三个参数:
//第一个是conetxt,也就是application的环境,可以设置为this,也可以通过getContext()获取.
//第二个参数是从data source中的array ID,也就是我们在strings中设置的ID号;
//第三个参数是spinner未展开的UI格式
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource( this,R.array.planets_arry, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spin.setAdapter(adapter);

在ArrayApdater中我们设置了为展开的方式,android提供了两种格式,当然我们也可以通过Android XML文件进行设置,如同ListView一样,下图分别是设置android.R.layout.simple_spinner_item和android.R.layout.simple_spinner_dropdown_item的显示,一般而言,我们都会显示前者。

 

如果我们不通过setDropDownViewResource进行设置,则展开的方式缺省同未展开的方式,否则必须进行设置,下图分别是设置android.R.layout.simple_spinner_item和android.R.layout.simple_spinner_dropdown_item。可以看出在下面左边的途中,展开和未展开的设置是不一样的。

 

2)设置回调函数

这里采用了一个类来描述回调处理

public class MyOnItemSelectedListener implements OnItemSelectedListener{
    @Override
    public void onItemSelected(AdapterView<?> parent, View arg1, int pos, long arg3){
        // 在这里我们复习一下Toast的用法 
        Toast.makeText(parent.getContext(),
                                  "The planet is "+  parent.getItemAtPosition(pos).toString(),
                                   Toast.LENGTH_LONG).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) { 
        //nothing to do
    }
}

在程序中使用spin.setOnItemSelectedListener(new MyOnItemSelectedListener());来设置回调对象即可。

例子三:自定义格式和数据

在上面的例子中,为展开和展开后的UI格式采用了Android自定义的格式,都可以自行定义。

ArrayAdapter adapter = new ArrayAdapter(this,R.layout.item,R.id.textView,list);

在上面的例子中,我们使用某个ArrayAdapter的构造函数,其中第一个参数是context,第二个参数指定下来菜单的每个条目的样式,第三个参数指定了在每个条目样式中用于显示数据的TextView的Id,第四个参数为列表的数据来源(可以是任何格式,toString()就是相应的赋值)。

 

相关链接: 我的Android开发相关文章

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值