Android基礎之——startActivityForResult啟動介面並返回資料,上傳頭像

來源:互聯網
上載者:User

標籤:android   style   class   blog   code   java   

在android應用的開發過程中,經常會出現啟動一個介面後填寫部分內容後帶著資料返回啟動前的介面,最典型的應用就是登入過程。在很多應用程式的模組中,都有“我的”這個模組,在未登入狀態下點擊其中的某一項,就會彈出登入介面,登入完成後回到我的介面,會顯示一些登入後的資料,這個功能的實現就要用到startActivityForResult.

下面通過一個小demo來說明一下startActivityForResult的使用,以及在實際開發中的一些應用。

demo的如下:


主介面布局:

三個按鈕,一個textview

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <Button        android:id="@+id/btn_a"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="20dip"        android:layout_marginTop="20dip"        android:text="啟動A介面並返回資料" />    <Button        android:id="@+id/btn_b"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="20dip"        android:layout_marginTop="20dip"        android:text="啟動B介面" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="20dip"        android:orientation="horizontal" >        <Button            android:id="@+id/btn_login"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="登入" />                <Button             android:id="@+id/btn_logout"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:visibility="gone"            android:text="登出"            />    </LinearLayout>    <TextView        android:id="@+id/tv_content"        android:layout_width="match_parent"        android:layout_height="30dip"        android:layout_marginLeft="20dip"        android:layout_marginRight="20dip"        android:layout_marginTop="20dip" /></LinearLayout>


主介面java代碼

public void onClick(View v) {Intent intent ;// TODO Auto-generated method stubswitch (v.getId()) {case R.id.btn_a:intent = new Intent(MainActivity.this, ActivityA.class);intent.putExtra("data", "傳遞給A的資料");startActivityForResult(intent, A);break;case R.id.btn_b:intent = new Intent(MainActivity.this, ActivityB.class);intent.putExtra("data", "傳遞給B的資料");startActivity(intent);break;case R.id.btn_login:intent = new Intent(MainActivity.this,LoginActivity.class);intent.putExtra("data", "傳遞給登入介面的資料");startActivityForResult(intent, LOGIN);break;case R.id.btn_logout:btnLogin.setClickable(true);logout.setVisibility(View.GONE);btnLogin.setText("登入");break;default:break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {switch (requestCode) {case A:Bundle bundle = data.getExtras();String back = bundle.getString("back");Toast.makeText(getApplicationContext(), "A介面傳回來的資料為:::::::"+back, 0).show();content.setText("A介面傳回來的資料"+back);break;case LOGIN:Bundle loginBundle = data.getExtras();String username = loginBundle.getString("username");String passwrod = loginBundle.getString("password");content.setText("登入介面傳回來的資料"+username+":::::::"+passwrod);btnLogin.setText("已登入");btnLogin.setClickable(false);logout.setVisibility(View.VISIBLE);Toast.makeText(getApplicationContext(), username+"::::::::"+passwrod, 0).show();break;default:break;}}}

其中主要的地方有兩個,一個是在啟動activity時,如果要帶結果返回,則需要使用startActivityForResult(intent, requestcode)這個方法,該方法兩個參數一個是帶資料的Intent,另一個就是請求碼,這個請求碼是用於給activity識別是哪個activity返回的資料,因為在一個activity中可能會出現多個startActivityForResult,因此返回的時候,activity為了識別是哪個activity返回的資料就要利用requestcode來進行區分。


上面還有一個很重要的方法onActivityResult(int requestCode, int resultCode, Intent data) 該方法在startActivityForResult啟動的activity結束後返回資料時調用,其中第二個參數是結果碼,結果碼為RESULT_OK時,說明activity順便結束並返回結果。

第一個參數requestcode就是被啟動的activity的識別碼,在startActivityForResult方法時傳入。

第三個參數data 是Intent型的資料,該資料就是從activity返回回來的資料,可以使用data.getExtras()方法得到bundle,然後從bundle中取出一些基本資料。

通過不同的結果碼,對不同的activity返回的資料進行相應的操作,就可以合理的完成一些特定的功能效果。



那麼,是不是所有的startActivityForResult啟動的activity都回返回資料呢?答案是否定的,要想要activity返回資料,在activity中也要進行響應的一些設定,請看activity的代碼

ActivityA的代碼如下:

protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);LinearLayout ll = new LinearLayout(this);LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);ll.setLayoutParams(params);ll.setOrientation(LinearLayout.VERTICAL);TextView tv = new TextView(this);tv.setText("我是A介面");ll.addView(tv);Button close = new Button(this);close.setText("關閉介面並返回");close.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.putExtra("back", "我是A介面返回的資料");setResult(RESULT_OK, intent);finish();}});ll.addView(close);setContentView(ll);Toast.makeText(getApplicationContext(),getIntent().getExtras().getString("data"), 0).show();}

注意其中有一段代碼,是setResult(RESULT_OK, intent); 之後緊接著 finish();

activity要能成功返回資料,就必須在結束finish()之前調用setResult方法,該方法的兩個參數,第一個為結果碼,也就是onActivityResult方法中的第二個參數resultcode,一般情況下我們都設定該值為RESULT_OK


ActivityB由於使用的是startActivity 因此無需返回資料

ActivityB的代碼如下:

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activityb);Button close = (Button) findViewById(R.id.btn_close);close.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubfinish();}});Toast.makeText(getApplicationContext(),getIntent().getExtras().getString("data"), 0).show();}


LoginActivity的代碼:

protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.login);etUsername = (EditText) findViewById(R.id.et_username);etPassword = (EditText) findViewById(R.id.et_password);Button login = (Button) findViewById(R.id.btn_login);login.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString password = etPassword.getText().toString().trim();String username = etUsername.getText().toString().trim();Toast.makeText(getApplicationContext(), "登入成功,返回原來介面", 0).show();Intent intent = new Intent();intent.putExtra("username", username);intent.putExtra("password", password);setResult(RESULT_OK, intent);finish();}});Toast.makeText(getApplicationContext(),getIntent().getExtras().getString("data"), 0).show();}


該介面登入成功後,將使用者名稱和密碼返回到首頁面,並顯示,同時首頁面不能再次登入,可以使用登出操作。


到這裡,這個小demo就完成了。

主要示範二個功能,一個是啟動activity並帶結果返回,將結果顯示在頁面上。

一個是啟動activity不帶結果返回,這種操作比較常用和簡單。


完整的代碼:http://download.csdn.net/download/yanglfree/7503139


下面再來說下startActivityForResult另一個比較常用的應用情境:上傳頭像


如下:


點擊頭像後,彈出選擇對話方塊,選擇相簿或者拍照,完成後會出現裁剪介面,裁剪完成後,會將頭像顯示在介面上,如果有伺服器的話,會將頭像上傳到伺服器。

看下幾段關鍵的代碼:

頭像的點擊事件:

public void onClick(View v) {CharSequence[] items = { "查看頭像", "手機相簿", "手機拍照" };new AlertDialog.Builder(MainActivity.this).setTitle("上傳照片").setItems(items, new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int which) {if (which == SELECT_PICTURE) {Intent intent = new Intent(Intent.ACTION_PICK);intent.setType("image/*");startActivityForResult(intent,PHOTO_REQUEST_GALLERY);} else if (which == SELECT_CAMERA) {Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");// 判斷儲存卡是否可以用,可用進行儲存if (hasSdcard()) {intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(Environment.getExternalStorageDirectory(),PHOTO_FILE_NAME)));}startActivityForResult(intent,PHOTO_REQUEST_CAMERA);} else if (which == SELECT_SCAN) {// TODO 查看頭像}}}).create().show();}});

其中,啟動相簿和拍照都是採用的startAcitivityForResult方法,並且,由於相簿和拍照都是系統應用,因此,intent使用指定的intent

拍照: "android.media.action.IMAGE_CAPTURE"

相簿:Intent.ACTION_PICK

在activityResult方法中:

public void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == Activity.RESULT_OK) {if (requestCode == PHOTO_REQUEST_GALLERY) {// 圖庫if (data == null) {return;}Uri uri = data.getData();crop(uri);} else if (requestCode == PHOTO_REQUEST_CAMERA) {// 拍照if (hasSdcard()) {file = new File(Environment.getExternalStorageDirectory(),PHOTO_FILE_NAME);crop(Uri.fromFile(file));} else {Toast.makeText(this, "未找到儲存卡,無法儲存照片!", 0).show();}} else if (requestCode == PHOTO_REQUEST_CUT) {// 裁剪try {bmp = data.getParcelableExtra("data");photo.setImageBitmap(bmp);File tempFile = BitmapUtils.saveBitmapFile(bmp,PHOTO_FILE_NAME);upload(tempFile);//上傳到伺服器 pd = new ProgressDialog(this);pd.setMessage("頭像正在上傳中請稍後");pd.show();} catch (Exception e) {e.printStackTrace();}} }}

完整的代碼下載:http://download.csdn.net/detail/yanglfree/7504613




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.