zoukankan      html  css  js  c++  java
  • Fragment

    把Fragment与Activity建立联系:

    * 静态Fragment:在布局中增加<fragment>标签,通过class属性指定Fragment
    * 动态Fragment:在Activity通过FragmentManager和FragmentTransaction管理Fragment
    大部分情况下,建议使用动态Fragment
     
    当使用动态Fragment时,可在Activity中使用如下方法来建立管理
    FragmentManager fragmentManager = this.getFragmentManager();
    FragmentTransaction tranaction = fragmentManager.beginTransaction(); 

    当需要切换Fragment时,使用如下方法来切换

    MyFragment fragment = new MyFragment();
    transaction.replace(R.id.layout, fragment, "myFragment");
    transaction.commit(); 

     Fragment中通过getActivity()获得当前所处的activity对象

    MainActivity activity = (MainActivity)getActivity();
    ListView listView = (ListView)activity.findViewById(R.id.listview); 

    activity可以通过FragmentManager中的方法查找到Fragment

    FragmentManager manager = getFragmentManager();
    MyFragment fragment = (MyFragment)manager.findFragmentById(R.id.my_fragment); 

    FragmentManager只能对Fragment进行查找、提取等操作

    如果希望进行添加删除修改的操作,需要使用FragmentTransaction
    FragmentManager对象通过如下方法可以获取FragmentTransaction
    FragmentTransaction tranaction = fragmentManager.beginTransaction(); 

    FragmentTransaction在事务提交前,可以把Fragment添加后退栈

    addToBackStack(String name)

    添加到后退栈后,如果进行后退的操作,就会返回前一个fragment,而不是直接退出应用了

     综合:
    FragmentManager manager = this.getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    MyFragment fragment = new MyFragment();
    transaction.add(R.id.linearlayout, fragment);
    transaction.addToBackStack(null);
    transaction.commit(); 

    DialogFragment中通过如下方法显示对话框

    show(FragmentManager manager, String tag)
    show(FragmentTransaction transaction, String tag)

     例:

    private ListView listview;
    private ArrayAdapter<String> adapter;
    private List<String> title; // 文章的标题
    private List<String> content; // 文章的内容
    private FragmentActivity activity; // 注意是FragmentActivity
    // 定义FragmentManager和FragmentTransaction对象
    private FragmentManager manager; // 管理一个个的Fragment
    private FragmentTransaction transaction;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
        // 通过inflater把layout中的布局转换成view
        View view = inflater.inflate(R.layout.left, null);
        // 添加title数据
        title = new ArrayList<String>();
        title.add("序言");
        title.add("第一章");
        title.add("第二章");
        // 添加content数据
        content = new ArrayList<String>();
        content.add("0000000");
        content.add("1111111");
        content.add("2222222");
        // 创建adapter对象
        activity = (FragmentActivity) getActivity(); // 获得Fragment对应的activity
        // 1. 获取FragmentManager对象
        manager = activity.getSupportFragmentManager();
        adapter = new ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, title);
        // 设置listview显示的数据
        // listview = (ListView) view.findViewById(R.id.listview);
        // listview.setAdapter(adapter);
        setListAdapter(adapter); // ListFragment中的方法
        return view;
    }
    
    // ListFragment特有的重写方法
    // 当List中一项被点击时 调用
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        FragmentRight right = new FragmentRight();
        switch (position) {
        case 0:
            // 给Fragment传递参数
            Bundle args0 = new Bundle();
            args0.putString("content", content.get(0));
            right.setArguments(args0);
            // 2 在合适的时候开始交易(点击按钮 触发事件……)
            transaction = manager.beginTransaction();
            // 3 添加对应的动态Fragment
            transaction.replace(R.id.right, // 动态fragment要添加到的地方(activity_main中的id)
                    right, // 待添加的动态fragment对象
                    "right"); // fragment的标签
            // 4 把当前fragment添加到后退栈中(可选 建议添加)按BACK时可以退回到上一个Fragment
            transaction.addToBackStack(null);
            // 5 提交
            transaction.commit();
            break;
        case 1:
            Bundle args1 = new Bundle();
            args1.putString("content", content.get(1));
            right.setArguments(args1);
            // 2 在合适的时候开始交易(点击按钮 触发事件……)
            transaction = manager.beginTransaction();
            // 3 添加对应的动态Fragment
            transaction.replace(R.id.right, // 动态fragment要添加到的地方(activity_main中的id)
                    right, // 待添加的动态fragment对象
                    "right"); // fragment的标签
            // 4 把当前fragment添加到后退栈中(可选 建议添加)按BACK时可以退回到上一个Fragment
            transaction.addToBackStack(null);
            // 5 提交
            transaction.commit();
            break;
        case 2:
            Bundle args2 = new Bundle();
            args2.putString("content", content.get(2));
            right.setArguments(args2);
            // 2 在合适的时候开始交易(点击按钮 触发事件……)
            transaction = manager.beginTransaction();
            // 3 添加对应的动态Fragment
            transaction.replace(R.id.right, // 动态fragment要添加到的地方(activity_main中的id)
                    right, // 待添加的动态fragment对象
                    "right"); // fragment的标签
            // 4 把当前fragment添加到后退栈中(可选 建议添加)按BACK时可以退回到上一个Fragment
            transaction.addToBackStack(null);
            // 5 提交
            transaction.commit();
            break;
        }
        super.onListItemClick(l, v, position, id);
    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.right, null);
        Bundle bundle = getArguments();
        String content = bundle.getString("content");
        TextView textview = (TextView) view.findViewById(R.id.textview);
        textview.setText(content);
        return view;
        
        
    }

    效果图:

    class MyDialogFragment extends DialogFragment {
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("标题");
            builder.setMessage("内容");
            AlertDialog dialog = builder.create();
            return dialog;
        }
    }

     

  • 相关阅读:
    [CodeForces]Codeforces Round #429 (Div. 2) ABC(待补)
    About Me
    2018-06-14
    Codeforces Codeforces Round #484 (Div. 2) E. Billiard
    Codeforces Codeforces Round #484 (Div. 2) D. Shark
    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes
    Codeforces Avito Code Challenge 2018 D. Bookshelves
    Codeforces Round #485 (Div. 2) D. Fair
    Codeforces Round #485 (Div. 2) F. AND Graph
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5334743.html
Copyright © 2011-2022 走看看