Sunday, May 25, 2014

Lưu trữ trong Android (SQLite)

[Đang thực hiện...]





Lưu trữ trong Android (SharePreference & File)

[Đang thực hiện...]







Spinner, Adapter, ViewHolder, Listview, Gridview

[Đang thực hiện...]





Sunday, May 11, 2014

Menu và Actionbar

Có 2 dạng menu cơ bản trong ứng dụng Android đó là Context Menu và Option Menu (từ các phiên bản Android 4.x trở lên thì có thể hiểu là Action Bar). Trong bài viết này chúng ta sẽ đi tìm hiểu 2 loại menu này.

Context Menu

Đây là dạng menu hiển thị lựa chọn khi người dùng thao tác với 1 đối tượng trong nhóm đối tượng có cùng tính chất. Ví dụ như khi thao tác chọn với 1 danh sách sinh viên, ta có thể đưa ra context menu với các tùy chọn như: thêm, sửa, xóa, hiển thị chi tiết. Để sử dụng context menu, người dùng cần đăng ký đối tượng cho context menu. Để gọi, người dùng cần bấm giữ đối tượng trong vài giây.
Các bước để tạo Context Menu
Bước 1: Khai báo menu (tạo mới 1 file menu_phone.xml trong thư mục menu) và viết mã code như bên dưới.

    
    
    
    


Bước 2: Trong hàm onCreateContextMenu thì đăng ký hiển thị menu xml vừa tạo ở trên.
getMenuInflater().inflate(R.menu.menu_phone, menu);

Bước 3: Trong hàm onContextItemSelected đăng ký xử lý sự kiện khi click lựa chọn trên menu
@Override
 public boolean onContextItemSelected(MenuItem item) {
  AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
    .getMenuInfo();
  String name = mContact[info.position];
  switch (item.getItemId()) {
  case R.id.menu_call:
   Toast.makeText(ContextMenu2Activity.this, "Call to " + name,
     Toast.LENGTH_SHORT).show();
   break;
  case R.id.menu_sms:
   Toast.makeText(ContextMenu2Activity.this, "SMS to " + name,
     Toast.LENGTH_SHORT).show();
   break;
  default:
   Toast.makeText(ContextMenu2Activity.this,
     "Do some thing with " + name, Toast.LENGTH_SHORT).show();
   break;
  }
  return super.onContextItemSelected(item);
 }

Bước 4: Đăng ký Context Menu cho một đối tượng trên layout của Activity.
registerForContextMenu(listContact);



Option Menu - Actionbar

Đối với các phiên bản Android 2.3 trở về trước, Option Menu trông có dạng như sau:


Từ phiên bản Android > 2.3 thì Option Menu được hiểu như Actionbar và trông có dạng như sau:


Để tạo option menu - actionbar ta làm theo các bước như sau:

Bước 1: Khai báo file menu menu_main.xml trong thư mục menu với nội dung như sau:


    
    
    
    
    
    
        
            
                
                
                
                
                
                
            
        
    



Bước 2: Trong hàm onCreateOptionsMenu đăng ký sử dụng menu đã viết ở trên.
@Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.menu_main, menu);
  menu.add(1, 999, 999, "Menu 999").setIcon(R.drawable.more);
  return true;
 }
Bước 3: Trong hàm onOptionsItemSelected đăng ký xử lý sự kiện khi click và item của menu.
@Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
  case R.id.menu_1:
   Intent intent_1 = new Intent(MainActivity.this,
     ContextMenu1Activity.class);
   startActivity(intent_1);
   return true;
  case R.id.menu_2:
   Intent intent_2 = new Intent(MainActivity.this,
     ContextMenu2Activity.class);
   startActivity(intent_2);
   return true;
  case R.id.menu_3:

   return true;
  case R.id.menu_4:

   return true;
  case R.id.menu_5:

   return true;
  default:
   return super.onOptionsItemSelected(item);
  }
 }


Source code ví dụ có thể tải tại đây.


Friday, May 9, 2014

Fragment

Tổng quan

Fragment có thể hiểu như là những "mảnh" nội dung độc lập được chèn vào bên trong activity. Chúng ta xem qua một số tình huống bên dưới để hiểu cách Fragment sử dụng trong lập trình Android.

Tình huống 1: Trên màn hình ứng dụng chúng ta muốn thể hiện 2 phần nội dụng. Phần 1 hiển thị một danh sách (ListView) các địa chỉ website, phần 2 dùng một WebView để hiển thị nội dung.
...hiển thị nội dung website được chọn ở ListView...
Tình huống 2: Lần này thay vì hiển thị nội dung website chúng ta cần hiển thị nội dung bức ảnh mà người dùng chọn ở danh sách.
...hiển thị nội dung ảnh..
Tình huống 3: Hai ví dụ trên nội dung và danh sách lựa chọn đều nằm trên cùng một màn hình. Nhưng vấn đề là để hiển thị tất cả như vậy thì nội dung cần màn hình hiển thị lớn (tablet), đối với màn hình nhỏ (phone) thì cần phân tách như hình bên dưới.
Hiển thị trên tablet và phone
Các tình huống trên chúng ta gặp vấn đề cần hiển thị 2 nội dung tách biệt hoàn toàn về giao diện lẫn thao tác mà chúng lại cần hoạt động đồng thời trên cùng màn hình activity. Để giải quyết vấn đề này chúng ta sử dụng Fragment như những mảnh ghép, ghép các nội dung khác nhau lại và đặt chúng vào trong cùng một activity. 

Lợi ích

Sử dụng Fragment đem lại những ưu điểm như:

  • Giúp cho việc tái sử dụng các thành phần trên các layout khác nhau trở nên dễ dàng.
  • Hỗ trợ việc hiển thị layout dạng dọc (portrait) hay ngang (landscape) ở trên bất kỳ điện thoại hay máy tính bảng nào.
  • Giúp nhà phát triển kiểm soát việc hiển thị cửa sổ đơn (single-pane) trên điện thoại và hiển thị đa cửa sổ (multi-pane) trên tablet.


Vòng đời

Cũng giống activity, fragment có vòng đời của riêng nó trải qua các bước như onCreate, onStart, onResume, onPause, onStop... tuy nhiên thì nó không phụ thuộc vào vòng đời của activity mà nó đính vào.


Phương thứcMô tả
onAttach()Fragment được đính vào activity. Activity lúc này cũng có thể chưa được khởi tạo đầy đủ.
onCreate()Fragment được tạo.
onCreateView()Fragment được tạo với giao diện đầy đủ. Giao diện view của fragment trở thành một phần trong giao diện view phân cấp của activity.
onActivityCreated()Activity và fragment được khởi tạo đầy đủ. Lúc này, view có thể được truy cập bởi phướng thức findViewById().
onResume()Fragment được kích hoạt và hiển thị lên giao diện người dùng.
onPause()Fragment vẫn tồn tại nhưng không hoạt động, tình huống này được hiểu như là một activity khác đang đè lên activity chứa fragment.
onStop()Fragment bị hủy.

Định nghĩa và sử dụng

Khai báo class kế thừa class Fragment

public class DetailFragment extends Fragment {

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.fragment_rssitem_detail,
    container, false);
  return view;
 }

 public void setText(String item) {
  TextView view = (TextView) getView().findViewById(R.id.detailsText);
  view.setText(item);
 }
}

Sử dụng Fragment kiểu tĩnh (statically)



    


Sử dụng Fragment kiểu động (dynamically)

public class DebugExampleTwo extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initFragment(new DebugExampleTwoFragment());
    }

    protected void initFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(android.R.id.content, fragment);
        fragmentTransaction.commit();
    }

}
Source code ví dụ có thể tải tại đây.