編輯:關於Android編程
在完成了 上一篇課程後,你已經有了一個應用。這個應用展示了一個包含一個文本框和一個按鈕的activity(一個單獨的界面)。在這次的課程中,你將會通過在MainActivity中添加一些代碼,來讓當給你點擊Send按鈕時能夠跳轉到另一個activity中。
為了響應按鈕的點擊事件,打開fragment_main.xml 布局文件,然後在
元素中加入android:onClick屬性:
這個 android:onClick 屬性的值, "sendMessage",是你的activity中的一個方法的名稱,當用戶點擊按鈕時,就會調用這個方法。
打開MainActivity 類,加入相應的方法:
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
}
為了能夠讓系統匹配到給android:onClick賦的值的方法名稱所對應的方法,簽名必須嚴格的按照顯示的來。(the
signature must be exactly as shown. )具體如下,這個方法必須要:
View 類型的參數(它就代表被點擊的View)
接下來,你就要填滿這個方法。來讀取文本框中的內容,然後將內容傳遞到另一個activity內。
Intent 是一個提供兩個分離的組件(例如兩個activities)在運行時綁定的對象。Intent 表示一個應用“意圖要做些事情”。你可以使用intent做很多很多事情,但是它最常用的還是打開另一個activity。
在sendMessage() 方法內部,創建一個Intent 來開啟一個名為DisplayMessageActivity的activity:
Intent intent = new Intent(this, DisplayMessageActivity.class);
這需要先導入 Intent 類:
import android.content.Intent;
貼士: 在Eclipse中,可以用Ctrl + Shift + O來導入未導入的類(在Mac中使用Cmd + Shift + O)。
這裡使用的構造器包含兩個參數:
Context (這裡使用this 是因為Activity 類是 Context的子類)Intent 的應用組件的類(在本例中是要被打開的activity)
在本應用中創建的intent是明確的intent,因為izhgeIntent 指定了intent應該給出的明確的應用組件。然後Intent同樣也可以是隱晦的,在一些情況下,intent並沒有指定組件,但是它允許在設備安裝的應用中滿足作為參數傳入Intent的規范的應用來響應這個intent。更多信息,請查看課程: Interacting
with Other Apps.
提示: DisplayMessageActivity 的將會導致一個error,因為你在使用向Eclipse這種IDE,它會發現這個類還不存在。現在先忽略這個錯誤,你馬上就會創建這個類。
Intent不僅僅只能夠打開另一個activity,它還能夠攜帶一個包含數據的bundle。在sendMessage() 方法內部,使用findViewById() 來獲取EditText元素,同時將它的值添加到intent中:
Intent intent = new Intent(this, DisplayMessageActivity.class); EditText editText = (EditText) findViewById(R.id.edit_message); String message = editText.getText().toString(); intent.putExtra(EXTRA_MESSAGE, message);
提示: 你現在需要導入android.widget.EditText。你馬上就要定義一個EXTRA_MESSAGE常量。
Intent 可以攜帶一系列被稱作extars的不同類型的鍵值對的集合。putExtra() 方式的第一個參數是鍵的名稱,第二個參數是值。
為了讓下一個activity能夠查到extra data,你應該使用公共的常量為你的intent的鍵賦值。因此,在MainActivity的頭部添加定義EXTRA_MESSAGE:
public class MainActivity extends ActionBarActivity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
...
}
在你的應用有何其他應用交互的情況下,使用你的應用的包名作為intent extras定義的鍵的定義是一個很好的選擇。
要打開一個activity,調用startActivity() 方法,並且將Intent傳進去,系統接受調用後會開啟intent所指定的Activity 的一個實例。
在新的代碼中,被Send按鈕調用的完整的sendMessage() 方法應該像下面這樣:
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
現在你需要創建DisplayMessageActivity 類來繼續工作了。
圖1. Eclipse中的新建Activity向導
使用Eclipse創建 activity :
。
DisplayMessageActivity 類現在應該是這樣:
public class DisplayMessageActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() { }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_display_message,
container, false);
return rootView;
}
}
}
如果你使用的IDE不是Eclipse,將DisplayMessageActivity 類更新為上面的代碼。
所有的Activity 的子類都必須實現onCreate() 方法,系統在創建新的activity實例時會調用這個方法。這個方法是你必須通過setContentView()方法指定activity布局的地方,同時也是你要初始化activity組件的地方。
提示: 如果你使用了非Eclipse的IDE,那麼你的工程不包含activity_display_message布局文件。沒關系,你馬上會更新這個方法,並不需要用到這個布局文件。
如果你使用Eclipse,你可以調到next section(下一節),因為模板已經提供了標題字符串。
如果你使用的是其他的IDE,將新的activity的標題添加到 strings.xml 文件中:
... My Message
所有的activity都必須在manifest文件中聲明,AndroidManifest.xml, 使用 元素。
當你使用的是Eclipse時,它創建了一個默認的實體。如果你使用的不是Eclipse,那麼你需要自己添加清單實體。像下面這樣:
...
android:parentActivityName 聲明了應用邏輯層次中這個activity父activity的名稱。系統會根據這個值來實現默認的導航行為,例如Android4.1或更高版本中的Up
navigation行為。你同樣可以通過使用Support Library 包,然後再 元素中添加這個值。
提示: 你的Android SDK應該已經包含最新版本的Support包。它被包含在ADT Bundle 中,但是如果你使用的不是Eclipse,你需要在Adding Platforms and Packages 步驟中安裝它。當使用Eclipse的模板時,Support包已經被自動添加到你的項目中了。如果你使用的不是Eclipse,你需要手動添加這個庫島你的項目中,按照setting up the Support Library 操作完後回到這裡來。
如果你使用Eclipse開發,那麼你現在就能夠運行程序了,但是並不會發生什麼。當點擊Send按鈕時跳轉到新的activity中,但是它使用的是默認的“Hello World”界面。你馬上就會更新這個activity,使用一個自定義的文本視圖來展示,所以如果你使用的不是Eclipse並且不能編譯通過,不用擔心。
每個Activity 都會被Intent調用,不管是不是用戶操作的。你可以通過調用getIntent() 方法來獲取開啟你的activity的intent,同時或者它裡邊包含的數據。
在 DisplayMessageActivity 類的onCreate() 方法中,獲取通過MainActivity傳遞過來的信息:
Intent intent = getIntent(); String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
要把信息顯示在屏幕上,需要創建一個TextView 控件,然後使用setText()方法。然後通過setContentView()方法添加這個TextView 作為activity布局的根視圖。
完整的 onCreate() 方法應該像下面這樣:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the message from the intent
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
// Create the text view
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
// Set the text view as the activity layout
setContentView(textView);
}
現在你可以運行你的應用了。它啟動之後,輸入信息到文本框中,然後點擊發送,輸入的信息將會出現在第二個activity中。
圖2. app中的兩個activity,運行於android 4.4
完成啦,你已經創建了你的第一個應用!
android動畫-拖動
先上圖看效果 實質上說是動畫有點不妥,確切的說應該是手勢的處理,廢話不多說看代碼public class SimpleDragSample extends Activ
Android自定義控件 ----- 基本繪制流程,簡單控件的實現
一、自定義控件(一) --- 自定義屬性TextView1,定義屬性,制作attrs.xml文件;屬性值:string,color,attr,array,bool,dec
Android 自定義ViewGroup之實現FlowLayout-標簽流容器
本篇文章講的是Android 自定義ViewGroup之實現標簽流式布局-FlowLayout,開發中我們會經常需要實現類似於熱門標簽等自動換行的流式布局的功能,網上也有
Android——ListView布局+適配器(三)
package com.example.administrator.newstop;import android.os.Bundle;import