为了尽量保证Fragment的独立性,Fragment类中不应该有访问其他Fragment和Activity中资源的代码,否则这个Fragment的独立性会被打破,不方便移植。
通常的做法是采用回调的方式实现非本Fragment的资源访问,需要访问外部资源的Fragment必须提供相应的接口,并OnAttach方法中对窗口类对象进行转化,而使用该Fragment的窗口必须实现该接口,大致思路如此。
请求访问外部资源的Fragment
package mobile.android.fragment.callback; 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; //Button的单击事件方法在此Fragment里面实现 public class TopFragment extends Fragment { private OnTopButtonClickedListener listener; // 提供回调方法的接口,通常嵌入该fragment的窗口类来实现该接口 public interface OnTopButtonClickedListener { // 回调方法 public void onClick(String name); } @Override public void onAttach(Activity activity) { // 嵌入该fragment的窗口类必须实现该接口,否则无法将该窗口类对象转化成该接口对象,也就无法调用回调方法 if (getActivity() instanceof OnTopButtonClickedListener) { listener = (OnTopButtonClickedListener) getActivity();//转化 } super.onAttach(activity); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.top_fragment, null); view.setOnClickListener(new OnClickListener() { //匿名内部类 @Override public void onClick(View v) { // TODO Auto-generated method stub if (listener != null) { //调用回调方法 listener.onClick("Top Fragment Demo"); } } }); return view; } }
实现接口的窗口类
package mobile.android.fragment.callback; import mobile.android.fragment.callback.TopFragment.OnTopButtonClickedListener; import android.app.Activity; import android.os.Bundle; //必须实现OnTopButtonClickedListener接口 public class FragmentCallbackActivity extends Activity implements OnTopButtonClickedListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment_callback); } //实现回调方法 @Override public void onClick(String name) { //通过tag获取BottomFragment对象 BottomFragment fragment = (BottomFragment) getFragmentManager() .findFragmentByTag("bottom_fragment"); fragment.updateText("onClick:" + name); } }
被访问资源所在的Fragment
package mobile.android.fragment.callback; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; public class BottomFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater .inflate(R.layout.bottom_fragment, container, false); //其实根视图就是一个EditText return view; } public void updateText(String value) { EditText editText = (EditText)getView(); editText.setText(value); } }
看来,Activity是负责处理涉及多个Fragment资源信息交互的承担者,好处就是Activity可以根据实际需要给出具体的操作,在修改的时候直接修改Activity里面的回调方法代码,无需修改Fragment,这样有效地保证Fragment的独立性,值得注意的一点是,提供接口的Fragment必须在OnAttach方法里面进行对象类型的转化,例如此处的
@Override public void onAttach(Activity activity) { // 嵌入该fragment的窗口类必须实现该接口,否则无法将该窗口类对象转化成该接口对象,也就无法调用回调方法 if (getActivity() instanceof OnTopButtonClickedListener) { listener = (OnTopButtonClickedListener) getActivity();//转化 } super.onAttach(activity); }
时间: 2024-10-11 20:47:21