Android – Một số View cơ bản – Phần 1


Được đăng vào ngày 20/05/2016 | 0 bình luận
Android – Một số View cơ bản – Phần 1
Đánh giá bài viết

Trong phần này chúng ta sẽ tìm hiểu một số lớp View cơ bản.

Spinner

SpinnerView cho phép chúng ta chọn một item trong một danh sách các item.

Ví dụ 1:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" >
    <Spinner android:id="@+id/spn" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:entries="@array/dlangs" 
        android:layout_marginTop="10dip" 
        android:prompt="@string/spn_title" />

   <TextView android:id="@+id/tvId" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dip" />        
        
</LinearLayout>

Trong file main.xml, chúng ta khai báo thẻ Spinner và thẻ TextView. Danh sách các item của Spinner sẽ được khai báo trong file strings.xml.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Spinner</string>
    <string name="spn_title">Choose a language</string>
    
    <string-array name="dlangs">
        <item>Python</item>
        <item>Java</item>
        <item>C++</item>      
        <item>Ruby</item>
    </string-array>    
    
</resources>

Trong file strings.xml chúng ta khai báo tên biến spn_title dùng làm tiêu đề cho Spinner, biến dlangs có kiểu string-array là danh sách các item cho Spinner.

package com.phocode;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Spinner;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;


public class MainActivity extends Activity implements OnItemSelectedListener 
{
    private TextView tv;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv = (TextView) findViewById(R.id.tvId);

        Spinner spn = (Spinner) findViewById(R.id.spn);
        spn.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) 
    {
      String item = parent.getItemAtPosition(pos).toString();
      tv.setText(item);
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) 
    {      
      tv.setText("");
    }
}

Item được chọn trong Spinner sẽ được dùng làm text của TextView.

public class MainActivity extends Activity implements OnItemSelectedListener 

Khi có Item nào được chọn thì Spinner sẽ giải phóng sự kiện, chúng ta implement giao diện OnItemSelectedListerner để bắt lấy sự kiện đó, có 2 phương thức phải override lại là onItemSelected()onNothingSelected().

Spinner spn = (Spinner) findViewById(R.id.spn);
spn.setOnItemSelectedListener(this);

Để các phương thức trên có thể bắt sự kiện thì chúng ta dùng phương thức setOnItemSelectedListener() của Spinner và truyền vào đối tượng có override các phương thức đó.

@Override
public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) 
{
    String item = parent.getItemAtPosition(pos).toString();
    tv.setText(item);
}

Trong phương thức onItemSelected() chúng ta lấy đối tượng item đang được chọn bằng phương thức onItemAtPosition(), sau đó chuyển thành String rồi gán làm text cho TextView.

Capture

Ví dụ 2

Trong ví dụ này chúng ta sẽ thiết kế lại như ví dụ trên, chỉ khác là các item sẽ được thêm vào trong Spinner từ file java chứ không nhập cứng từ file resource nữa.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" >
    
    <Spinner android:id="@+id/spnId"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dip" 
        android:prompt="@string/spn_title" />    
      
    <TextView android:id="@+id/tvId"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dip" />
    
</LinearLayout>

Trong file main.xml chúng ta có 2 ViewSpinnerTextView. Spinner ở đây không được thiết lập thuộc tính src nữa.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Spinner2</string>
    <string name="spn_title">Choose a language</string>
</resources>

Trong file strings.xml chúng ta bỏ danh sách item đi, chỉ còn biến lưu tiêu đề của Spinner.

package com.phocode;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;

public class MainActivity extends Activity implements OnItemSelectedListener
{
    private TextView tv;
    private Spinner spn;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv = (TextView)findViewById(R.id.tvId);
 
        spn = (Spinner)findViewById(R.id.spn);
 
        List<String> lst = new ArrayList<String>();
        lst.add("Python");
        lst.add("Java");
        lst.add("C++");
        lst.add("Ruby");
        ArrayAdapter<String> da = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, lst);        
 
        spn.setAdapter(da);
 
        spn.setOnItemSelectedListener(this);    
    }       

    @Override
    public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) 
    {
      String item = parent.getItemAtPosition(pos).toString();
      tv.setText(item);
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) 
    {      
      tv.setText("");
    }
}

Trong file MainActivity.java chúng ta thiết lập dữ liệu cho Spinner và override các phương thức lắng nghe sự kiện như ví dụ trên.

List<String> lst = new ArrayList<String>();
lst.add("Python");
lst.add("Java");
lst.add("C++");
lst.add("Ruby");

Đầu tiên chúng ta sử dụng List để tạo một danh sách các item sẽ được lưu vào Spinner.

ArrayAdapter<String> da = new ArrayAdapter<String>(this,
        android.R.layout.simple_spinner_item, lst);

Tiêp theo chúng ta sử dụng một đối tượng ArrayAdapter, đối tượng này có tác dụng liên kết dữ liệu giữa SpinnerList<String>, mỗi khi List có sự thay đổi, chẳng hạn như thêm hoặc xóa bớt item thì Spinner cũng sẽ tự động thêm/bớt các item đó.

spn.setAdapter(da);

Có đối tượng ArrayAdapter rồi thì chúng ta phải thiết lập adapter đó cho Spinner.Capture

SeekBar

SeekBar hiển thị một thanh trượt và một cái nút trên thanh trượt đó cho phép chúng ta kéo qua kéo lại trong một khoảng giá trị số nào đó, mỗi khi nút trên thanh trượt thay đổi thì SeekBar sẽ giải phóng sự kiện và chúng ta bắt sự kiện đó bằng cách dùng giao diện OnSeekBarChangeListener.

Ví dụ:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" >  
    <SeekBar android:id="@+id/sbId" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_margin="10dp" 
        android:max="100" 
        android:progress="50" />
    <TextView android:id="@+id/tvId" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginLeft="10dp" />     
</LinearLayout>

Ở đây chúng ta thiết kế một SeekBar và một TextView, TextView được dùng để hiển thị giá trị của SeekBar. Khoảng giá trị mặc định của SeekBar là từ 0 đến 100. Trong đó chúng ta có thể thiết lập giá trị max bằng thuộc tính android:max, tuy nhiên chúng ta không thể thiết lập giá trị min được.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">SeekBar</string>
    <string name="textview_value">50</string>
</resources>

Trong file strings.xml chúng ta khai báo biến textview_value làm giá trị khởi tạo ban đầu cho TextView.

package com.phocode;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class MainActivity extends Activity implements 
    OnSeekBarChangeListener
{
    TextView tv;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        SeekBar sb = (SeekBar) findViewById(R.id.sbId);
        sb.setOnSeekBarChangeListener(this);

        tv = (TextView) findViewById(R.id.tvId);
        String val = this.getString(R.string.textview_value);
        tv.setText(val);
    }

   @Override
   public void onProgressChanged(SeekBar seekBar, int progress,
     boolean fromUser) 
   {
       tv.setText(String.valueOf(progress));
   }

   @Override
   public void onStartTrackingTouch(SeekBar seekBar) 
   {
       
   }

   @Override
   public void onStopTrackingTouch(SeekBar seekBar) 
   {
       
   }
}

Đoạn text trong TextView dùng chung với giá trị của SeekBar.

public class MainActivity extends Activity implements 
    OnSeekBarChangeListener

Lớp MainActivity implement giao diện OnSeekBarChangeListener. Giao diện này có 3 phương thức cần phải override là onProgressChanged(), onStartTrackingTouch() và onStopTrackingTouch(). Ở đây chúng ta chỉ cần dùng đến phương thức đầu tiên.

SeekBar sb = (SeekBar) findViewById(R.id.sbId);
sb.setOnSeekBarChangeListener(this);

Chúng ta lấy đối tượng SeekBar và gắn listener cho nó là đối tượng Activity hiện tại vì đối tượng này đã implement giao diện OnSeekBarChangeListener.

tv = (TextView) findViewById(R.id.tvId);
String val = this.getString(R.string.textview_value);
tv.setText(val);

Sau đó chúng ta lấy giá trị của biến textview_value rồi dùng làm text của TextView.

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
    boolean fromUser) 
{
    tv.setText(String.valueOf(progress));
}

Khi chúng ta kéo nút trên SeekBar, phương thức onProgressChanged() sẽ được gọi, giá trị thay đổi được truyền trong tham số progress, chúng ta dùng tham số này làm text của TextView.

Capture







Bình luận

Hãy trở thành người đầu tiên bình luận

Thông báo cho tôi qua email khi
avatar