1. 程式人生 > >談談-Android中的接口回調技術

談談-Android中的接口回調技術

賦值 布局 event public 理解 cti schema alt group

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中的接口回調技術