標籤:建立 無法 常見 static exce roi except edit 服務端
Android中的介面回調技術有很多應用的情境,最常見的:Activity(人機互動的連接埠)的UI介面中定義了Button,點擊該Button時,執行某個邏輯。
下面參見上述執行的模型,講述James對Android介面回調技術的理解(結合前人的知識和自己的實踐)。
使用一個比喻很形象地說明:用戶端有個疑問打電話請教服務端,但服務端無法現場給出解答,相互之間約定:服務端一旦有答案,使用電話的方式反饋給用戶端。
以上有三個主體:用戶端、服務端和介面(方式)。
介面回調的原理框圖說明:
Demo介面如下:
實際效果如下:
其中ToDoListActivity的布局XML檔案設計為:使用fragment標籤填充。
<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" tools:context="com.demo.ToDoListActivity" > <fragment android:id="@+id/fragment_new_item" android:name="com.demo.NewItemFragment" android:layout_width="match_parent" android:layout_height="wrap_content" /> <fragment android:id="@+id/fragment_todo_list" android:name="com.demo.ToDoListFragment" android:layout_width="match_parent" android:layout_height="wrap_content" /></LinearLayout>
Demo原始碼:
package com.demo;import android.app.Activity;import android.app.Fragment;import android.os.Bundle;import android.text.TextUtils;import android.view.KeyEvent;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnKeyListener;import android.view.ViewGroup;import android.widget.EditText;/** * <功能描述> 為New Item定義的Fragment * * @author Administrator */public class NewItemFragment extends Fragment { private static final String TAG = NewItemFragment.class.getSimpleName(); /** * <功能描述> 步驟1:建立指定的介面 * * @author Administrator */ public interface OnNewItemAddedListener { // 步驟2:建立介面中的相關方法 public void onNewItemAdded(String newItem); }
// 步驟3:聲明回調介面的對象,介面類對象 private OnNewItemAddedListener onNewItemAddedListener;
@Override public void onAttach(Activity activity) { super.onAttach(activity); try { // 步驟4:擷取父Activity,為聲明的介面對象賦值 onNewItemAddedListener = (OnNewItemAddedListener) getActivity(); } catch (Exception e) { throw new ClassCastException(activity.toString() + " must implement OnNewItemAddedListener"); } }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 建立或填充Fragment的UI,並返回View對象 View contentView = inflater.inflate(R.layout.new_item_fragment, container, false); final EditText etContent = (EditText) contentView .findViewById(R.id.et_content); etContent.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { LogUtil.d(TAG, "KeyEvent.ACTION_DOWN"); if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) || (keyCode == KeyEvent.KEYCODE_ENTER)) { LogUtil.d(TAG, "KeyEvent.KEYCODE_ENTER"); if (!TextUtils.isEmpty(etContent.getText().toString())) { LogUtil.d(TAG, "content:>" + etContent.getText().toString() + "<"); String content = etContent.getText().toString(); // 步驟5:建立某種情境,使用該介面回調方法 onNewItemAddedListener.onNewItemAdded(content); etContent.setText(""); return true; } } } return false; } }); return contentView; }}
使用者和介面UI互動的Activity原始碼:
package com.demo;import android.app.Activity;import android.app.FragmentManager;import android.os.Bundle;import android.widget.ArrayAdapter;import com.demo.NewItemFragment.OnNewItemAddedListener;import java.util.ArrayList;/** * <功能描述> 步驟6:在其他類中使用,並實現該介面 * * @author Administrator */public class ToDoListActivity extends Activity implements OnNewItemAddedListener { private static final String TAG = ToDoListActivity.class.getSimpleName(); private ArrayList<String> mTodoItem; private ArrayAdapter<String> mArrayAdapter;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); initData(); // 擷取FragmentManager執行個體,擷取xml檔案中的fragment FragmentManager fragmentManager = getFragmentManager(); ToDoListFragment todoListFragment = (ToDoListFragment) fragmentManager .findFragmentById(R.id.fragment_todo_list); todoListFragment.setListAdapter(mArrayAdapter); } private void initView() { setContentView(R.layout.main); } private void initData() { mTodoItem = new ArrayList<String>(); mArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mTodoItem); } @Override protected void onResume() { super.onResume(); LogUtil.d(TAG, "onResume..."); } @Override public void onNewItemAdded(String newItem) { // 步驟7:實現該介面,並使用其中的功能 mTodoItem.add(0, newItem); mArrayAdapter.notifyDataSetChanged(); }}
上述Demo的ToDoListActivity實現了自訂的NewItemFragment中的介面OnNewItemAddedListener,也就需要實現該介面中的抽象方法。通過下述方法:
// 步驟4:擷取父Activity,為聲明的介面對象賦值onNewItemAddedListener = (OnNewItemAddedListener) getActivity();
將ToDoListActivity執行個體傳遞到了NewItemFragment中,也就是能夠執行ToDoListActivity執行個體中的onNewItemAdded()方法,而這個方法由ToDoListActivity覆寫了(實際執行的是覆寫後的方法和邏輯)。
Android中介面回調技術總結:
Android介面回調方法總共需要執行以下7個步驟:
1. 建立指定的介面類,並建立介面中的相關方法;
2. 在某個類(一般是服務端)中聲明介面對象(建立該介面類對象),即需要在該類中使用該介面;
3. 在使用到該介面對象的情境(一般也是服務端)中為該介面類對象賦值(也就是服務端一般都會執行個體化介面對象,使用用戶端的該介面執行個體初始化);
5. 在該情境中(一般服務端中)使用介面回調中的方法(介面的方法);
6. 上述步驟4中的賦值對象(用戶端傳遞的執行個體對象,方法有多種:new介面執行個體或者用戶端實現該介面)需要實現該介面;
7. 上述步驟6中的類(用戶端),覆寫介面中的方法;
文章出自:http://www.cnblogs.com/CVstyle/p/6216913.html
談談-Android中的介面回調技術