有一個很經典的例子說的是,小王有個數學問題要問小李,小李一時沒做出來,對小王說,我先記着等我知道答案了再打電話告訴你。
在這個例子中首先小王向小李問問題,這個時候小王要把自己這個對象發給小李,這樣小李在回撥電話的時候纔不會不知道要打給誰。其次是小王要有小李這個對象的引用,這樣才知道打給誰。第三,有一個接口,通過這個接口小李可以把答案發給小王,因此小王必須繼承這個接口。
這個經典的例子在我接口回調學習初期很難深入到可以理解真正的安卓代碼應用,昨天我就遇到這麼一個問題,苦苦思索一晚上,有了點頭緒但不一定是對的,今天和大家一起討論下。
在我的例子(網上經典例子)中有leftFragment 和 rightFragment兩個Fragment;先將兩個Fragment加入到MainActivity中;從leftFragment中做出的動作顯示在rightFragment中。
先看leftFragment的代碼:
package com.example.fragmentactivity;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
public class LeftFragment extends Fragment implements OnClickListener {
//Activity繼承並實現這個接口即可實現資源的共享了
public interface MyListener{
public void showMessage(int x);
}
MyListener mylistener;
Button firstButton;
Button secondButton;
Button thirdButton;</span>
//根據Fragment的生命週期,當Activity添加這個Fragment時候第一個調用的方法。通過此方法,Fragment獲得了所在Activity的引用,</span>
//作用類似上述例子中的小李獲得了小王的引用</span>
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
mylistener=(MyListener) activity;
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.leftfragment,null);
return view;
}
@Override
public void onResume() {
firstButton = (Button) getView().findViewById(R.id.first_button);
secondButton=(Button) getView().findViewById(R.id.second_button);
thirdButton=(Button) getView().findViewById(R.id.third_button);
firstButton.setOnClickListener(this);
secondButton.setOnClickListener(this);
thirdButton.setOnClickListener(this);
// TODO Auto-generated method stub
super.onResume();
}
@Override
public void onClick(View v) {
Button button=(Button) v;
switch( button.getId()){
case R.id.first_button:</span>
<span style="font-family: Arial, Helvetica, sans-serif;">//通過mylistener調用Activity具體實現這個方法。相當於小李回調小王,告訴小王答案。</span>
mylistener.showMessage(1);
break;
case R.id.second_button:
mylistener.showMessage(2);
break;
case R.id.third_button:
mylistener.showMessage(3);
break;
}
}
</span>
接下來的是MainActivity
package com.example.fragmentactivity;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.widget.TextView;
import com.example.fragmentactivity.LeftFragment.MyListener;
public class MainActivity extends Activity implements MyListener{ //這裏集成了具有回調函數的接口,小王的特徵1
TextView showMessageView;
<span style="white-space:pre"> </span>//這裏是對接口函數的具體實現
@Override //
public void showMessage(int x) {
showMessageView.setText("hello world");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fr= getFragmentManager();
FragmentTransaction tr=fr.beginTransaction();
//實例化兩個Fragment
LeftFragment leftFragement = new LeftFragment();
RightFragment rightFragment = new RightFragment();
</pre><pre name="code" class="java">//這裏的add函數將出發Fragment的onAttach函數,把當前引用的發送出去,相當於小王把自己的電話留給小李,小李知道答案後可以會撥給小王。
tr.add(R.id.left_layout,leftFragement);
tr.add(R.id.right_layout,rightFragment);
tr.commit();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
showMessageView=(TextView) findViewById(R.id.right_show_message);
super.onResume();
}
}
總之這裏的接口回調概念就體現的很徹底了,在本例中Activity讓LeftFragment接受按鈕出發,LeftFragment把接收到的信息回調給Activity。
總之我們看出這裏面最主要的方法時tr.add這個方法,這個方法導致了哪些操作呢?下圖說明了這一過程,具體涉及到Fragment和Activity的生命週期,這裏就不具體講了。
相關源代碼免費下載:http://download.csdn.net/detail/shenlei190810/7720839