2013年1月22日 星期二

[Android]Android傳值實作之Activity間傳值

關於activity的介紹
Survey:Android程式設計(十二) Activity互動作業-2

本來想寫在 [Android]小練習及觀念釐清之class間互相呼叫  裡面
但遇到蠻多狀況的,所以想獨立出來寫一篇

今天嘗試寫一個Activity 呼叫Activity的專案,專案名稱act2act

主程式:
public class MainActivity extends Activity {

private Button bt1;
private TextView tv1;
private EditText et1;
public String ma1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1 = (Button)this.findViewById(R.id.bt1);
tv1 = (TextView)this.findViewById(R.id.tv1);
et1 = (EditText)this.findViewById(R.id.et1);

bt1.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
                                //取得et1得到的字串並轉成String assign到ma1
ma1 = et1.getText().toString();
                                //new一個intent物件
Intent intent = new Intent();
                                //設定intent物件來源跟目的
intent.setClass(MainActivity.this,ma2.class);
                                //new一個bundle
Bundle bundle = new Bundle();
                                //把資料丟進bundle
bundle.putString("number",ma1);
                                //把bundle丟進intent裡面,像盒中盒的概念
intent.putExtras(bundle);
                                //startActivity
startActivity(intent);

                                這行待會探討
//intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}});
}}
主程式2:

public class ma2 extends Activity {

private Button bt2;
private TextView tv2;
private EditText et2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.ma2);
        //設定ma2專屬的TexTView
        tv2 = (TextView)findViewById(R.id.tv2);
        //設定要接收的intent
        Intent intent= this.getIntent();
        //設定要接收的bundle
        Bundle bundle=intent.getExtras();
        //將接收的bundle擷取裡面的String number裡的值
        final String gstring = bundle.getString("number");
        //設定顯示在tv2上
        tv2.setText(gstring);

兩個layout就不多說了
setContentView記得設成指定的layout

AndroidManifest.xml:

若沒有註冊另一個Activity在AndroidManifest.xml的話在執行專案時會出現:
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.kh.act2act/com.kh.act2act.ma2}; have you declared this activity in your AndroidManifest.xml?
記得註冊,反而是主程式一的最後一行,因為卡住的因素 上網找了一下解決方案有看到這個描述:

我想要呼叫一個PreferenceActivity,使用了下列方式
Intent i = new Intent(MyPreferenceActivity.this, Settings.class);startActivity(i);
但卻出現了異常終止,查了一下log,得到錯誤資訊如下:Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?然後Goolge了一下都知道,Context中有一個startActivity方法,Activity繼承自Context,重載了startActivity方法。如果使用ActivitystartActivity方法,不會有任何限制,而如果使用ContextstartActivity方法的話,就需要開啟一個新的task,遇到上面那個異常的,都是因為使用了ContextstartActivity方法。解決辦法是,加一個flag所以只要再加上一個flag就行了i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

試試看註解掉,結果還是正常 但AndroidManifest.xml的註冊一拿掉 問題還是出現
所以結論是可以不用註冊flag 但一定要加AndroidManifest.xml的註冊


收工! 





沒有留言:

張貼留言