Fragment与Activity之间传值,Fragment与Fragment传值以及对commit的理解

来源:互联网 发布:刷指数软件 编辑:程序博客网 时间:2024/05/18 18:46
    fragment一和activity产生关系就会被初始化也就是说fragment方法会被走一遍
      若想在点击条目的时候通过setarguments 传值必须在事务提交此fragment之前setarugments
       否则会报空指针因为getarguments找不到值所以可通过方法回调来传值    另外,也可通过在点击条目的
     时候调用activity中的方法
    此方法中进行添加fragment到framlayout并提交事务在此方法的参数中传入我们要传递的值    
        在viewpager和fragment一起使用时并不知道fragment在什么时候被初始化
        所以通过方法回调来传值(但是只能从mainactivity往fragment中传值)因为找不到初始化的那个fragment
        或者通过静态方法来传值在添加fragment到布局中时候可知道
        fragment是在提交事务的时候被初始化所以可通过在提交事务之前通过setarguments
        和getarguments来传值动态加载同样可通过方法回调来传值在new fragment的时候
        添加进布局的方法中选择带3个参数的最后一个参数是tag这样当找到的时候可以通过
          (mainactivity)getactivity.getsupportfragmentmanager.getfragmentbytag来
          找到对应的fragment这样就是找到了初始化的fragment然后通过方法回调来传值
          (方法回调步骤)在需要传值的类中定义一个接口和一个公共方法此公共方法中的参数是接口
         在this.接口=接口 中将成员变量的接口赋值(即把要调用此公共方法并实现此接口的对象返回到它身上)
         在需要传值的方法体中接口.方法 在接收参数的类中找到要传值的初始化对象 然后让此对象.公共方法
          并实现此接口参数,在重写的方法中获取传过来的值
          有多态的思想,动态绑定,依赖倒置
         多态 :父类引用指向子类对象 重写 继承
          接口指向实现对象 重写 实现

    !!!   当我们用接口回调方法在fragment与fragment之间传值的时候记得一定要在与fragment产生关联的activity的oncreate方法中

       去提交(commit)fragment 因为commit属于费时操作若不提前提交会造成空指针异常

public class MainActivity extends FragmentActivity {

    private FragmentManager supportFragmentManager;
    private Fragment1 f1;
    private Fragment2 f2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        f1 = new Fragment1();
        f2 = new Fragment2();


        supportFragmentManager = getSupportFragmentManager();
        FragmentTransaction beginTransaction = supportFragmentManager.beginTransaction();
    
        beginTransaction.add(R.id.framelayout, f1, "f1");
        beginTransaction.add(R.id.framelayout, f2, "f2");
        beginTransaction.show(f2);
        beginTransaction.hide(f1);
        Bundle bundle = new Bundle();
        bundle.putString("key", "asdgasdg");
        f1.setArguments(bundle);
        beginTransaction.commit();


    }
    public void show3(){
        FragmentTransaction beginTransaction = supportFragmentManager.beginTransaction();
        beginTransaction.show(f1);
        beginTransaction.hide(f2);
        beginTransaction.addToBackStack("");

        beginTransaction.commit();



    }

public class Fragment2 extends Fragment{
    private ListView lv;
    private ArrayList<String> liststr;
    private Pass pass;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment2, null);
        lv = (ListView) view.findViewById(R.id.lv);
        
        return view;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        liststr = new ArrayList<String>();
        for (int i = 0; i < 10; i++) {
            liststr.add("天空"+i);
        }
        lv.setAdapter(new Myadapter());
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
                TextView lvtv = (TextView) view.findViewById(R.id.lvtv);
                pass.fun(lvtv.getText().toString());
                
            }
        });

    }
    interface Pass{
        void fun(String str);
    }
    public void pass_value(Pass pass){
        this.pass = pass;        
    }
    private class Myadapter extends BaseAdapter{

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return liststr.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            View view = View.inflate(getActivity(), R.layout.listview_item, null);
            TextView lvtv = (TextView) view.findViewById(R.id.lvtv);
            lvtv.setText(liststr.get(position));
            return view;
        }

    }

public class Fragment1 extends Fragment{
    private TextView f1tv;
    private MainActivity main;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment1, null);
        f1tv = (TextView) view.findViewById(R.id.f1tv);
        return view;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        main = (MainActivity) getActivity();
        Bundle arguments = getArguments();
        Log.e("sgdsdg", arguments.getString("key"));
        Fragment2 f2 = (Fragment2) main.getSupportFragmentManager().findFragmentByTag("f2");
        f2.pass_value(new Pass() {
            
            @Override
            public void fun(String str) {
                // TODO Auto-generated method stub
                f1tv.setText(str);
                main.show3();
            }
        });
        
        
    }

下面代码为接口回调必须提交的代码只粘一个fragment解释其余一样


public class CarttoonsortFragment extends BaseFragment{
    private ListView lv;
    private CartBook cb;
    private ArrayList<String> list;
    @Override
    public View initViews() {
        // TODO Auto-generated method stub
        View view = View.inflate(activity, R.layout.carttoonsortfragment, null);
        lv = (ListView) view.findViewById(R.id.carttoonsortfrag_lv);
        return view;
    }

    @Override
    public void initDatas() {
        // TODO Auto-generated method stub
        getDataFromNet();
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                CartToonActivity mactivity = (CartToonActivity) activity;
                TextView tv = (TextView) arg1.findViewById(R.id.leftfrag_lv_tv);
                if(cb==null){
                    Toast.makeText(mactivity, "空指针", 0).show();
                }else{
                    cb.pass(tv.getText().toString());
                }
                FragmentManager manager = mactivity.getSupportFragmentManager();
                FragmentTransaction trans = manager.beginTransaction();
                CarttoonsortFragment sortfrag = (CarttoonsortFragment) manager.findFragmentByTag("carttoonsortFragment");
                CarttoonlistFragment listfrag = (CarttoonlistFragment) manager.findFragmentByTag("CarttoonlistFragment");


                trans.hide(sortfrag);
                trans.show(listfrag);
                trans.addToBackStack("2");
                trans.commit();

            }
        });

    }
    private void getDataFromNet() {
        // TODO Auto-generated method stub
        HttpUtils utils = new HttpUtils();
        utils.send(HttpMethod.GET, "http://japi.juhe.cn/comic/category?key=7adb2d7bceb254a778afb248e2742aab", new RequestCallBack<String>() {

            @Override
            public void onFailure(HttpException arg0, String arg1) {
                // TODO Auto-generated method stub
                Toast.makeText(activity, "网络加载失败", 0).show();
            }

            @Override
            public void onSuccess(ResponseInfo<String> arg0) {
                // TODO Auto-generated method stub
                String result = arg0.result;
                parseData(result);
            }
        });

    }
    private class Mylistviewadapter extends BaseAdapter{

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int arg0, View arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            arg1 = View.inflate(activity, R.layout.leftfragment_listview_item, null);
            TextView tv = (TextView) arg1.findViewById(R.id.leftfrag_lv_tv);
            tv.setText(list.get(arg0));


            return arg1;
        }

    }
    protected void parseData(String result) {
        // TODO Auto-generated method stub
        Gson gson = new Gson();
        CarttoonSort sort = gson.fromJson(result, CarttoonSort.class);
        list = sort.result;
        lv.setAdapter(new Mylistviewadapter());

    }
    public void passValueBook(CartBook cb){
        this.cb = cb;

    }
    public interface CartBook{
        public abstract void pass(String str);
    }

}

public class CartToonActivity extends FragmentActivity {

    private FragmentManager manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_cart_toon);
        
        manager = getSupportFragmentManager();
        CarttoonsortFragment carttoonsortFragment = new CarttoonsortFragment();
        CarttoonlistFragment carttoonlistFragment = new CarttoonlistFragment();
        CarttoonchapterFragment carttoonchapterFragment = new CarttoonchapterFragment();
        CarttoonDetailFragment carttoonDetailFragment = new CarttoonDetailFragment();
        
        FragmentTransaction trans = manager.beginTransaction();
//搞不清下个replace为什么改成add会出现页面重叠因为没点击mainactivity中的跳转
//时此activity没有实例化理应没走此处代码
        /**后来查阅资料得知
         * 当你点击run或者RUN as -Android appliction,程序就开始运行加载了
         * 所以此activity早就被加载因为过早被加载导致
         * mainactivity中的页面和此actvity中的页面重叠
         * mainactivity中的viewpager没有被及时destroy掉致使
         * viewpager滑动时页面重叠而造成这一原因的就是事务的add
         */
        trans.replace(R.id.carttoon_activity_fl, carttoonsortFragment, "carttoonsortFragment");
        trans.add(R.id.carttoon_activity_fl, carttoonlistFragment, "CarttoonlistFragment");
        trans.add(R.id.carttoon_activity_fl, carttoonchapterFragment, "carttoonchapterFragment");
        trans.add(R.id.carttoon_activity_fl, carttoonDetailFragment, "carttoonDetailFragment");
        trans.show(carttoonsortFragment);
        trans.hide(carttoonchapterFragment);
        trans.hide(carttoonDetailFragment);
        trans.hide(carttoonlistFragment);
        trans.addToBackStack("1");
        trans.commit();
/**!!!!!记得所有fragment都要提交
 *     先提交事务才能接口回调一般我们提交是在oncreate中也可以在用户输入的时候
 * 但是我的项目中想要在用户输入的时候不只commit而且要接口回调这就造成了空指针因为commit会耗时
 *     当我用setarguments一样报空指针当我们想要在activity和fragment之间传值和fragment和fragment之间
 * 传值的时候必然依赖于activity所以我们在activity和fragment之间传值的时候用setarguments而当我们在fragment
 * 和fragment之间传值的时候用接口回调而fragment要在最好在oncreate中去提交(防止空指针)
 */
    }










1 0