Cơ bản về Intent (phần 2)

Thảo luận trong 'Điện thoại, viễn thông' bắt đầu bởi sonw890i, 6/9/12.

  1. sonw890i New Member

    sonw890i

    Tham gia ngày:
    1/9/12
    Bài viết:
    1
    Đã được thích:
    2
    Điểm thành tích:
    0
    Trong phần 1, mình đã trình bày những kiến thức cơ bản về Intent. Tiếp theo mình sẽ hướng dẫn các bạn làm một Tutorial đơn giản để hiểu rõ hơn những vấn đề nêu trong lý thuyết.

    -Giả sử bạn cần viết một app để tính các phần tử của một dãy số được cho theo quy luật:
    PHP:
    a0,b0 nhập từ bàn phím
    a
    (n+1)=a(n)+b(n)
    b(n+1)=a(n)*b(n)  
    Để thực hiện, chúng ta xây dựng hai Activities 1 và 2. Activity 1 sẽ làm nhiệm vụ lấy dữ liệu nhập vào sau đó gọi Activity 2 tính toán kết quả và lấy dữ liệu trả về. Người dùng sẽ quyết định tiếp tục tính toán hay reset lại từ đầu. Toàn bộ quá trình này được minh họa như hình vẽ dưới đây:
    [​IMG]
    [​IMG]

    -Đầu tiên bạn tạo một New Project như sau:

    PHP:
    Project NameIntentBasic
    Target
    bất kỳ (vd 1.5)
    Package namecom.vietanddev.intent
    Application name
    Intent Basic  
    Tiếp theo bạn tạo layout cho hai Activities như hình vẽ dưới
    [​IMG][​IMG]
    input.xml

    PHP:
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        
    android:id="@+id/RelativeLayout01" 
        
    android:layout_width="fill_parent" 
        
    android:layout_height="fill_parent">
    <
    TextView android:id="@+id/TextView01" 
        
    android:layout_width="wrap_content"  
        
    android:text="A = " 
        
    android:layout_margin="20dip"
        
    android:layout_height="wrap_content"></TextView>    
    <
    EditText android:id="@+id/txtNum1" 
        
    android:text="0"    
        
    android:layout_width="fill_parent" 
        
    android:layout_height="wrap_content"
        
    android:layout_alignBottom="@id/TextView01"
        
    android:background="@android:drawable/editbox_background"
        
    android:layout_marginRight="10dip"
        
    android:layout_toRightOf="@id/TextView01"></EditText>    
    <
    TextView android:id="@+id/TextView02" 
        
    android:layout_width="wrap_content" 
        
    android:layout_below="@id/txtNum1" 
        
    android:text="B = " 
        
    android:layout_margin="20dip"
        
    android:layout_height="wrap_content"></TextView>    
    <
    EditText android:id="@+id/txtNum2"
        
    android:text="0"        
        
    android:layout_width="fill_parent"   
        
    android:layout_height="wrap_content"
        
    android:background="@android:drawable/editbox_background"
        
    android:layout_marginRight="10dip"
        
    android:layout_toRightOf="@id/TextView02"
        
    android:layout_alignBottom="@id/TextView02"></EditText>
    <
    Button android:id="@+id/btnGo" 
        
    android:text="Calculate" 
        
    android:layout_margin="10dip"
        
    android:layout_width="wrap_content" 
        
    android:layout_below="@id/txtNum2"
        
    android:layout_height="wrap_content"></Button>
    </
    RelativeLayout>  
    result.xml

    PHP:
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        
    android:id="@+id/RelativeLayout01" 
        
    android:layout_width="fill_parent" 
        
    android:layout_height="fill_parent">
    <
    TextView android:id="@+id/TextView01" 
        
    android:layout_width="wrap_content"  
        
    android:text="A + B = " 
        
    android:layout_margin="10dip"
        
    android:layout_height="wrap_content"></TextView>    
    <
    EditText android:id="@+id/txtSum" 
        
    android:text=""
        
    android:layout_marginRight="10dip"
        
    android:layout_marginTop="5dip"    
        
    android:layout_width="fill_parent" 
        
    android:layout_height="wrap_content"
        
    android:background="@android:drawable/editbox_background"
        
    android:layout_toRightOf="@id/TextView01"></EditText>    
    <
    TextView android:id="@+id/TextView02" 
        
    android:layout_width="wrap_content" 
        
    android:layout_below="@id/TextView01" 
        
    android:text="A * B = " 
        
    android:layout_margin="10dip"
        
    android:layout_height="wrap_content"></TextView>        
    <
    EditText android:id="@+id/txtMul"
        
    android:text=""
        
    android:layout_marginRight="10dip"
        
    android:layout_marginTop="10dip"    
        
    android:layout_width="fill_parent"   
        
    android:layout_height="wrap_content"
        
    android:layout_below="@id/txtSum"
        
    android:background="@android:drawable/editbox_background"
        
    android:layout_toRightOf="@id/TextView02"></EditText>
    <
    Button android:id="@+id/btnContinue" 
        
    android:text="Continue" 
        
    android:layout_margin="10dip"
        
    android:layout_width="wrap_content" 
        
    android:layout_below="@id/txtMul"
        
    android:layout_height="wrap_content"></Button>
    <
    Button android:id="@+id/btnReset" 
        
    android:text="Reset" 
        
    android:layout_marginTop="10dip"
        
    android:layout_width="wrap_content"
        
    android:layout_height="wrap_content"
        
    android:layout_below="@id/txtMul" 
        
    android:layout_toRightOf="@id/btnContinue"></Button>
    </
    RelativeLayout>  
    -Bây giờ là phần quan trọng nhất: Lấy dữ liệu nhập vào và gọi thực hiện Activity 2
    +Thực thi interface cho Activity 1

    PHP:
    public class intentbasic extends Activity implements OnClickListener{...}  
    +Xử lý sự kiện cho nút Calculate

    PHP:
              @Override
        
    public void onClick(View arg0) { 
                    ...
            
    // Tạo intent mới và đặt action = "Calculate"
            
    Intent intent = new Intent();
            
    intent.setAction("Calculate");
            
    // Lấy dữ liệu nhập vào trong Editbox
            
    String strNum1 txtNum1.getText().toString();
            
    String strNum2 txtNum2.getText().toString();
            
    // Đưa dữ liệu vào intent dưới dạng các cặp (key,value)
            
    intent.putExtra("A"strNum1);
            
    intent.putExtra("B"strNum2);
            
    // Phát intent gọi thực hiện Activity 2
            
    startActivityForResult(intent,INTENT_REQUEST_CODE)  ;
                    ...
             }  
    Chú ý: INTENT_REQUEST_CODE ở đây là một số nguyên do người lập trình định trước ở đầu chương trình. Số nguyên này như một thẻ bài và cần thống nhất giữa bên phát intent và bên xử lý kết quả trả về (như bạn sẽ thấy dưới đây trong phần Xử lý kết quả trả về)

    PHP:
    private static int INTENT_REQUEST_CODE 123;  
    Không quên đăng ký xử lý cho nút Calculate

    PHP:
    //protected void onCreate(Bundle savedInstanceState) {
                    
    btnCalculate.setOnClickListener(this);  
    -Xử lý kết quả trả về từ Activity 2

    PHP:
    @Override
        
    protected void onActivityResult(int requestCodeint resultCodeIntent data) {
            
            if(
    requestCode != INTENT_REQUEST_CODE) {
                
    txtNum1.setText("Are you well on your way?");
                
    txtNum2.setText("");
                return;
            }
                    
    //nếu đúng là intent từ nguồn phát của chúng ta
            
    else if(resultCode == RESULT_OK){
                            
    //Lấy kết quả được trả về
                
    String strNum1 data.getStringExtra("sA");
                
    String strNum2 data.getStringExtra("sB");
                            
    //Thiết lập giá trị mới cho Editbox (a(n) & b(n))
                
    txtNum1.setText(strNum1);
                
    txtNum2.setText(strNum2);
            }
            else if(
    resultCode == RESULT_CANCELED){
                
    txtNum1.setText("0");
                
    txtNum2.setText("0");
            }
        }  
    -Phần còn lại là thực hiện tính toàn bên Activity 2
    +Lấy dữ liệu và tính toán

    PHP:
    // Lấy dữ liệu gửi từ Activity 1 qua intent
            
    String strA getIntent().getStringExtra("A");
            
    String strB getIntent().getStringExtra("B");
            
    // Tính toán với dữ liệu
            
    int A Integer.parseInt(strA);
            
    int B Integer.parseInt(strB);
            
    int sum A+BstrA Integer.toString(sum);
            
    int mul A*BstrB Integer.toString(mul);
            
    // Đưa kết quả ra màn hình
            
    txtSum.setText(strA);
            
    txtMul.setText(strB);  
    +Nếu user muốn tiếp tục quá trình tính toán, túc nút Continue được nhấn
    // Tạo một intent mới với action = "Calculate"

    PHP:
    Intent returnResult = new Intent("Calculate");
            
    // Lấy dữ liệu sau khi đã tính toán
            
    String strMul txtMul.getText().toString();
            
    String strSum txtSum.getText().toString();
            
    // Đưa dữ liệu vào Extras của intent
            
    returnResult.putExtra("sA"strSum);
            
    returnResult.putExtra("sB"strMul);
            
    // Kiểm tra dữ liệu, nếu rỗng thì gửi mã CANCEL
            // ,nếu không gửi mã OK và intent chứa kết quả
            
    if(strSum.equals("") || strMul.equals(""))
                
    setResult(RESULT_CANCELED,returnResult);
            else
                
    setResult(RESULT_OK,returnResult);
            
    // Thông báo kết thúc Activity
            
    finish();  
    +Nếu user muốn reset lại từ đầu, tức nút Reset được nhấn

    PHP:
    Intent returnCancel = new Intent("Calculate");
            
    setResult(RESULT_CANCELED,returnCancel);
            
    finish();  
    Đến đây chúng ta đã hoàn tất Tutorial. Hy vọng qua ví dụ này các bạn đã hiểu được lý thuyết về Intent và cơ chế truyền nhận dữ liệu qua Intent. Hình vẽ dưới minh họa kết quả chạy chương trình:
    [​IMG][​IMG]
    [​IMG][​IMG]

    Code : IntentBasic.zip




    haoqb tại vietanddev.com
     
    2 people like this.
    Đang tải...
  2. minh117 New Member

    minh117

    Tham gia ngày:
    19/3/13
    Bài viết:
    19
    Đã được thích:
    6
    Điểm thành tích:
    0
    Giới tính:
    Nam
    Cảm ơn nhiều.:D
    Bài hữu ích lại còn rất hay ;)
     
  3. minh117 New Member

    minh117

    Tham gia ngày:
    19/3/13
    Bài viết:
    19
    Đã được thích:
    6
    Điểm thành tích:
    0
    Giới tính:
    Nam
    Mọi người ơi giúp với :
    Mình chưa hiểu lắm về setAction ?!?
    // Tạo intent mới và đặt action = "Calculate"
    Intent intent = new Intent();
    intent.setAction("Calculate");
    Như vậy thì làm sao nó hiểu mà đi qua ResultActivity o_O

    ~~> VÀ nó báo lỗi là như thế này.
    android.content.ActivityNotFoundException: No Activity found to handle Intent { act=Calculate (has extras) }
    ==> làm sao để sử dụng setAction, hình như nó là Action tự định nghĩa của Intent thì phải :confused:
    Help me !!!
     

Chia sẻ trang này