Fragment与Activity传递数据

MainActivity如下:

package cc.testsimplefragment0;

import android.os.Bundle;
import android.app.Activity;
import android.app.FragmentTransaction;
import cc.testsimplefragment0.TitlesListFragment.TitlesListFragmentCallBack;
/**
 * Demo描述:
 * Fragment基本使用以及Fragment与Activity之间数据的传递
 * 
 * 参考资料:
 * Android疯狂讲义(第二版)
 * 
 * 备注说明:
 * 利用接口实现Fragment与Activity的信息传递.
 * 这个思路是不错的.
 * 在此总结一下Fragment与Activity之间交换数据的方式:
 * 1 Activity向Fragment传递数据
 *   fragment.setArguments(bundle)
 * 2 Fragment向Activity传递数据
 *   在Fragment内部定义一个回调接口.让包含该Fragment的
 *   Activity实现该接口.这样Fragment就可调用该回调方法
 *   将数据传给Activity
 * 
 */
public class MainActivity extends Activity implements TitlesListFragmentCallBack{

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
  }

  //实现TitlesListFragmentCallBack接口中的方法
  @Override
  public void onItemSelected(int index) {
    DetailFragment detailFragment=new DetailFragment();
    Bundle bundle=new Bundle();
    bundle.putInt(Data.ID, index);
    //向detailFragment传入参数
    detailFragment.setArguments(bundle);
    
    //开始Fragment的事务Transaction
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    //替换容器(container)原来的Fragment
    fragmentTransaction.replace(R.id.relativeLayoutContainer, detailFragment); 
    //设置转换效果
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    //将事务添加到Back栈.即按下Back键时回到替换Fragment之前的状态.类似于Activity的返回
    fragmentTransaction.addToBackStack(null);
    //提交事务
    fragmentTransaction.commit(); 
  }

  

}

TitlesListFragment如下:

package cc.testsimplefragment0;

import android.app.Activity;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
/**
 * 备注说明:
 * 因为是继承自ListFragment
 * 所以不用覆写onCreateView()方法
 *
 */
public class TitlesListFragment extends ListFragment {
  private TitlesListFragmentCallBack mTitlesListFragmentCallBack;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //设置适配器
    ArrayAdapter<String> arrayAdapter=
    new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_checked, Data.TITLES);
    setListAdapter(arrayAdapter); 
    
  }
  
  //当该Fragment被添加,显示到Activity时调用该方法
  //在此判断显示到的Activity是否已经实现了接口
  @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (!(activity instanceof TitlesListFragmentCallBack)) {
      throw new IllegalStateException("TitlesListFragment所在的Activity必须实现TitlesListFragmentCallBack接口");
    }
    mTitlesListFragmentCallBack=(TitlesListFragmentCallBack) activity;
  }
  
  //当该Fragment从它所属的Activity中被删除时调用该方法
  @Override
  public void onDetach() {
    super.onDetach();
    mTitlesListFragmentCallBack=null;
  }
  
  //点击ListFragment中某个条目时调用该方法
  @Override
  public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    mTitlesListFragmentCallBack.onItemSelected(position);
    //设置ListView为单选模式
    getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    //显示选中的条目
    getListView().setItemChecked(position, true); 
  }
  
  //定义一个业务接口
  //该Fragment所在Activity需要实现该接口
    //该Fragment将通过此接口与它所在的Activity交互
  public interface TitlesListFragmentCallBack{
    public void onItemSelected(int index);
  }

}

DetailFragment如下:

package cc.testsimplefragment0;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class DetailFragment extends Fragment {
  private int id=0;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments().containsKey(Data.ID)) {
      id=getArguments().getInt(Data.ID);
    }
  }
  
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.detail_fragment, container, false);
    TextView titleTextView=(TextView) view.findViewById(R.id.titleTextView);
    titleTextView.setText(Data.TITLES[id]);
    
    TextView detailTextView=(TextView) view.findViewById(R.id.detailTextView);
    detailTextView.setText(Data.DETAILS[id]);
    
    return view;
  }

}

Data如下:

package cc.testsimplefragment0;
public final class Data {
  public static final String ID="id";
  //标题
    public static final String[] TITLES = { "标题1","标题2", "标题3","标题4"};
    //内容
    public static final String[] DETAILS = { "内容1","内容2", "内容3","内容4"};
}
posted @   gao_chun  阅读(266)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示