安卓成长记(三)

安卓成长记(三)

这样看果然是够慢的。不过也确实学到很多东西了。

之前讲了SimpleAdapter。这个虽然功能强大,但是有点死,就是也只能有那样的构造函数。(应该是哈)它能完成大部分的应用场景,但是对于少部分完不成的,可以使用扩展BaseAdapter的方法。

扩展BaseAdapter

这个扩展BaseAdapter就有点麻烦了

public class MainActivity extends Activity
{
    ListView myList;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myList = (ListView) findViewById(R.id.myList);
        //程序到这里为止还是挺正常的。
        //下面就是扩展这个Adapter。不像SimpleAdapter一个构造函数就明白了的那种
        //BaseAdapter的函数里面有四个函数,实现了就完了,
        //其中最重要的就是getCount()和getView()函数
        //getView()好像是返回每一个列表项应该是个什么样子的
        BaseAdapter adapter = new BaseAdapter()
        {
            @Override
            public int getCount()
            {
                // 指定一共包含40个选项
                return 40;
            }
            @Override
            public Object getItem(int position)
            {
                return null;
            }
            // 重写该方法,该方法的返回值将作为列表项的ID
            @Override
            public long getItemId(int position)
            {
                return position;
            }
            // 重写该方法,该方法返回的View将作为列表框
            //这里说是列表框,其实就是每个列表项要有的东西以及内容
            //不过我十分怀疑能不能用xml文件去表示。
            //不用怀疑,是能的,忘了之前的打气筒了么?
            //将一个xml文件用打气筒打起来
            @Override
            public View getView(int position
                    , View convertView , ViewGroup parent)
            {
                // 创建一个LinearLayout,并向其中添加两个组件
                //返回的是一个Layout的实例。这个就很有趣了是不是,居然是layout,
                //这个layout里面还加了料。
                //另外这种方式就是利用java写布局文件的吧。
                //那种,打气筒的后半部分跟SimpleAdapter一样的,都是找到那个组件,
                //并弄好什么样的组件显示什么内容那种。
                LinearLayout line = new LinearLayout(MainActivity.this);
                line.setOrientation(0);
                ImageView image = new ImageView(MainActivity.this);
                image.setImageResource(R.drawable.ic_launcher);
                TextView text = new TextView(MainActivity.this);
                text.setText("第" + (position +1 ) + "个列表项");
                text.setTextSize(20);
                text.setTextColor(Color.RED);
                line.addView(image);
                line.addView(text);
                // 返回LinearLayout实例
                return line;
            }
        };
        myList.setAdapter(adapter);
    }
}

掌握好两个函数就行了,扩展BaseAdapter也是很简单的!

自动完成文本框:AutoCompleteTextView

自动完成的文本框,他是TextView的子类。

先看下面的代码:

public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 创建一个ArrayAdapter,封装数组
        ArrayAdapter<String> aa = new ArrayAdapter<String>(this,
                android.R.layout.simple_dropdown_item_1line, books);
        actv = (AutoCompleteTextView)findViewById(R.id.auto);
        // 设置Adapter
        actv.setAdapter(aa);
    }

android.R.layout.simple_dropdown_item_1line
这句话但是有意思,连本来应该放在layout里面的东西也没了,直接用系统提供的东西就行了。

注意有很多系统提供的,不叫布局文件的布局文件,专门用在Adapter里面的

可展开的列表项

我看这个也没什么用就先不写了

spinner

spinner继承了Absadapter,AbsAdapter继承了AdapterView,那用spinner的时候只要按着AdapterView的性质为其准备好一个Adapter就行了。

按着惯例,spinner也能在xml文件里面指定entries的属性,而且spinner本身也就是下拉列表框,也不需要有样式什么的。

但是如果要动态的指定要下拉的内容的话,或许还是要配置Adapter的。

不过一般的spinner都是指定下拉框就行了,没必要指定adapter,一般也不动态变化的吧。

public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 获取界面布局文件中的Spinner组件
        spinner = (Spinner) findViewById(R.id.spinner);
        String[] arr = { "孙悟空", "猪八戒", "唐僧" };
        // 创建ArrayAdapter对象
        //这种的就是能动态配置adapter的吧。
        //上面的数组是动态传过来的,那可以这样,从网络上下载一个xml文件,解析之后弄成一个数组
        //这样就能也算是动态弄了一个Adapter了吧。
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_multiple_choice, arr);
        // 为Spinner设置Adapter
        spinner.setAdapter(adapter);
    }

进度条这个东西

大的小的环形的那种进度条是不能显示进度的。
ps一句,我就服了,为啥main.xml文件有错误。activity文件也有错误,而且还是莫名其妙的错误。

public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        bar = (ProgressBar) findViewById(R.id.bar);
        bar2 = (ProgressBar) findViewById(R.id.bar2);
        // 启动线程来执行任务
        //下面这个是老生常谈了,新建一个线程,实现里面的run()方法,后边儿加个start()就行了
        new Thread()
        {
            public void run()
            {
                while (status < 100)
                {
                    // 获取耗时操作的完成百分比
                    status = doWork();
                    // 发送消息
                    mHandler.sendEmptyMessage(0x111);
                }
            }
        }.start();
    }

再看一次这样的模板

        new Thread()
        {
            public void run()
            {
            }
        }.start();
    }

还有handler的模板:

Handler mHandler = new Handler()
    {
        @Override

        public void handleMessage(Message msg)
        {
        }
    };

这个组件一样的Handler啊。

android:progressDrawable=”@drawable/my_bar”
这个是指定progressbar的外观。
可以指定已完成的和未完成的外观:

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 定义轨道的背景 -->
    <item android:id="@android:id/background"
          android:drawable="@drawable/no" />
    <!-- 定义轨道上已完成部分的样式 -->
    <item android:id="@android:id/progress"
          android:drawable="@drawable/ok" />
</layer-list>

根元素是:

layer-list
条目是:
< item android:id=”@android:id/background”
android:drawable=”@drawable/no” />

根元素是那个layer-list挺有意思的。”@android:id/background”这个东西是指定背景外观。”@android:id/progress”这个东西是指定完成的样式。

拖动条seekbar

拖动条就是控制音量那种的,明白了吧?seekbar

你知道他多没节操不?滑块儿都可以自己定义!

public void onCreate(Bundle savedInstanceState)
    {
        SeekBar seekBar = (SeekBar) findViewById(R.id.seekbar);
        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
        {
            // 当拖动条的滑块位置发生改变时触发该方法
            @Override
            public void onProgressChanged(SeekBar arg0, int progress,
                                          boolean fromUser)
            {
                // 动态改变图片的透明度
                //一个激灵,这能行吗?
                //想想人家就是可以啊,这个跟按钮不是一样的么
                //人家在UI县城里面,又不是在非UI线程里
                image.setImageAlpha(progress);
            }
        });
    }

xml文件:

        android:max="255"
        android:progress="255"
        android:thumb="@drawable/ic_launcher"

thumb是滑块儿指定,没节操吧?
max和progress是最大的值和当前值。这个值在系统里面也应该是个确定的数值。

public void onProgressChanged(SeekBar arg0, int progress,
boolean fromUser)
上面的那个是系统传进来的progress。

Ratingbar这个是ProgressBar的继承者

他就是不滑了,改成星星了。

<RatingBar
        android:id="@+id/rating"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:numStars="5"
        android:max="255"
        android:progress="255"
        android:stepSize="0.5"/>

就是里面的星星也不能改,要他有啥用啊,就能做个评分项目了估计也。
指定最大255也没啥意思啊。

image.setImageAlpha((int) (rating * 255 / 5));
rating是float的,五个星星,大概float是几点几的意思吧,比如3.5颗星星,转化为一个星星占的比例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值