上一章總結是在看完後寫的,感受遺漏不少,從這章起是邊閱讀邊總結。java
因爲有了新的事情,《第一行代碼》的總結要停一段時間,但不會過久。android
在 onCreat()中添加。app
Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener(){ //註冊監聽器 public void onClick(View v){ Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show(); } });
經過findViewById()方法得到佈局元素,返回的是View對象,(Button)轉型成Button對象。ide
爲按鈕註冊監聽器。佈局
Ps:在這裏設置了自動導包this
@+id/xxx 在 xml 定義一個idcode
@id/xxx 在 xml 引入一個idorm
res下建立menu文件夾,建立main,建立
<item android:id="@+id/app_item" android:title="Add"/> <item android:id="@+id/remove_item" android:title="Remove"/>
在活動中添加onCreatetionsMenu(),使用getMenuInflater().inflate(R.menu.main,menu),第一個參數爲建立菜單的資源文件,第二個參數爲菜單項添加到的Menu對象。對象
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main,menu); return true; }
定義菜單響應事件,在活動中重寫onOptionsItemSelected(),經過調用item.getItemId() 來判斷咱們點擊的是哪個菜單項。
public boolean onOptionsItemSelected(MenuItem item){ switch (item.getItemId()){ case R.id.app_item: Toast.makeText(this,"You clicked Add",Toast.LENGTH_SHORT).show(); break; case R.id.remove_item: Toast.makeText(this,"You clicked Remove",Toast.LENGTH_SHORT).show(); break; default: } return true; }
修改按鈕監聽器中的代碼(我把以前的代碼註釋掉了):
button1.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ //Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show(); finish(); } });
Ps:Intent是Android程序中各組件之間進行交互的一種重要方式。
建立第二個活動
修改第一個活動中按鈕的點擊事件(一樣註釋):
button1.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ //Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show(); //finish(); Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivity(intent); } });
先構建Intent ,傳入MainActivity.this 做爲上下文,傳入 SecondActivity.class 做爲目標活動。
經過startActivity()方法執行Intent。
按下back鍵銷燬當前活動,回到上一個活動。
在
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="com.example.androidtest.ACTION_START"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
修改MainActivity中按鈕的點擊事件
button1.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ //Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show(); //finish(); //Intent intent = new Intent(MainActivity.this,SecondActivity.class); //startActivity(intent); Intent intent = new Intent("com.example.androidtest.ACTION_START"); startActivity(intent); } });
android.intent.category.DEFAULT 是一種默認的 category ,在調用 startActivity 方法時會自動將這個category 添加到 Intent 中。
修改主活動爲
button1.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ Intent intent = new Intent(Intent.ACTION_VIEW); //指定Intent的action爲Intent.ACTION_VIEW,爲安卓內置動做 intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); //經過Uri.parse()方法,將網址字符串解析成Uri對象,再調用setData()方法傳遞這個Uri對象。
setData()接受一個Uri對象,用於指定當前Intent正在操做的數據。
建立活動 ThirdActivity 與 third_layout
在 AndroidManifest.xml中註冊
進行配置
<activity android:name=".ThirdActivity" tools:ignore="AppLinkUrlError"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="http"/> </intent-filter> </activity>
tools:ignore="AppLinkUrlError" 經過提示增長!
修改主活動:
public void onClick(View v){ String data = "Hello SecondActivity"; Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("extra_data",data); //接受兩個參數,第一個是鍵 startActivity(intent); }
修改 SecondActivity :
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_layout); Intent intent = getIntent(); //獲取用於啓動SecondActivity的Intent String data = intent.getStringExtra("extra_data"); Log.d("SecondActivity",data); }
主活動中寫入:
public void onClick(View v){ Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivityForResult(intent,1); //在活動銷燬的時候返回一個結果給上一個活動。第二個參數是請求碼,用於在以後的回調中判斷數據的來源。 }
SecondActivity:
button2.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){Intent intent = new Intent(); intent.putExtra("data_return","Hello 主活動"); setResult(RESULT_OK, intent); //重要!專門用於上一個活動返回數據。第一個參數用於向上一個活動返回處理結果,通常只用RESULT_OK 或 RESULT_CANCELED這兩個值,第二個參數則吧帶有數據的Intent 傳遞回去。 finish();} //銷燬活動 });
protected void onActivityResult(int requestCode,int resultCode, Intent data) { //第一個參數是活動傳入的請求碼1,第二個參數是在返回數據時傳入的處理結果RESULT_OK。 super.onActivityResult(requestCode, resultCode, data); //注意 switch (requestCode) { case 1: if (requestCode == RESULT_OK) { String returnedData = data.getStringExtra("data_return"); Log.d("MainActivity", returnedData); } break; default: } }
在以上的基礎上,在SecondActivity 中重寫:
public void onBackPressedf(){ Intent intent = new Intent(); intent.putExtra("data_return","Hello 主活動"); setResult(RESULT_OK,intent); finish(); }
新建項目,建立主活動、兩個子活動(NormalActivity、DialogActivity)與對應的佈局。兩個子活動佈局各添加一個TextView,主活動佈局添加兩個button。
修改AndroidManifest.xml:
<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog"></activity>
修改主活動代碼:
private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity); Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity); startNormalActivity.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ Intent intent = new Intent(MainActivity.this,NormalActivity.class); startActivity(intent); } }); startDialogActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this,DialogActivity.class); } }); } @Override protected void onStart() { super.onStart(); Log.d(TAG,"onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG,"onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG,"onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG,"onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG,"onDestory"); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG,"onRestart"); }
啓動活動時若發現返回棧的棧頂已是該活動,則認爲能夠直接使用它,再也不建立新的活動實例。
修改AndroidManifest.xml:
在activity標籤內加android:launchMode="singleTop"
新建一個類(Java Class):無需註冊
public class BaseActivity extends AppCompatActivity { //繼承AppCompatActivity! @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("BaseActivity",getClass().getSimpleName()); } }
讓全部類繼承 BaseActivity