2010/08/13

Andoird startActivityForResult

這篇文章可以解決以及瞭解下列問題:
1. 如何從Dialog取得回傳值
2. 如何在兩個Activity之間傳遞訊息
3. 如何使用startActivityForResult
4. 如何使用setResult
5. 如何在Dialog做出等寬的按鈕

假設一個情境:某個MainActivity要叫出一個Login的對話框。使用者輸入後,從Login對話框中取得nickname以及password然後在MainActivity進行登入動作。

※這個方法是用Activity假裝Dialog來取得資料

首先先撰寫LoginActivity部份

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;

public class LoginActivity extends Activity {

    // UI
    private EditText nickname;
    private EditText password;
    
    private Button okBtn;
    private Button cancelBtn;
    
     /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.login_dialog);
        
        // Width to Fill Parent
        LayoutParams params = getWindow().getAttributes(); 
        params.width = LayoutParams.FILL_PARENT; 
         getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
        
        // UI Assign
        nickname = (EditText) findViewById(R.id.nickname);
        password = (EditText) findViewById(R.id.password);
        
        okBtn = (Button) findViewById(R.id.okBtn);
        cancelBtn = (Button) findViewById(R.id.cancelBtn);
        
        
        okBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {

                // make intent
                Intent intent = new Intent();
                intent.putExtra("nickname", nickname.getText().toString());
                intent.putExtra("password", password.getText().toString());
                
                // setResult(RESULT_OK, Intent)
                LoginActivity.this.setResult(RESULT_OK ,intent);
                
                // close activity
                LoginActivity.this.finish();
            }
        });
        
        cancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                LoginActivity.this.setResult(RESULT_CANCELED);
                LoginActivity.this.finish();
            }
        });
    }
}


然後是layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">
    <TextView android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip" android:text="@string/nickname_lbl">
    </TextView>
    <EditText android:id="@+id/nickname" android:layout_height="wrap_content"
        android:layout_width="fill_parent" />
    <TextView android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip" android:text="@string/password_lbl">
    </TextView>
    <EditText android:id="@+id/password" android:layout_height="wrap_content"
        android:layout_width="fill_parent" />
    <TableLayout android:id="@+id/row1" android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:layout_weight="1">
        <TableRow android:layout_weight="1">
            <Button android:id="@+id/okBtn" android:layout_width="0dip"
                android:layout_height="wrap_content" android:text="@string/ok_lbl"
                android:layout_weight="1" />
            <Button android:id="@+id/cancelBtn" android:layout_width="0dip"
                android:layout_height="wrap_content" android:text="@string/cancel_lbl"
                android:layout_weight="1" />
        </TableRow>
    </TableLayout>
</LinearLayout>

接下來開始寫主程式

public class MainActivity extends Activity {

    // Sub Activity Code
    protected static final int LOGIN_ACTIVITY_CODE = 1;

    private Button connectBtn;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        connectBtn = (Button) findViewById(R.id.connectBtn);

        connectBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            // Start Login Activity
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            startActivityForResult(intent, LOGIN_ACTIVITY_CODE);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent data) {
        if (requestCode == LOGIN_ACTIVITY_CODE) {
            if (resultCode == RESULT_OK) {
                // Log
                Log.d(TAG, "Get Result From Login Activity");
                Log.d(TAG, data.getStringExtra("nickname"));
                Log.d(TAG, data.getStringExtra("password"));
                
                // Login Setting
                cManager.setNickname(data.getStringExtra("nickname"));
                cManager.setPassword(data.getStringExtra("password"));
                
                // Connect
                connectToServer();
            }
        }
    }
}


記得要在AndroidManifest.xml加入這個才能以Dialog形式顯示Activity

<activity android:name=".LoginActivity"
          android:label="@string/login_activity"
          android:theme="@android:style/Theme.Dialog">
</activity>

其他我就不想多說了,有問題再說。

No comments:

Post a Comment