zoukankan      html  css  js  c++  java
  • Android用户界面开发:Fragment

    Android用户界面开发:Fragment

    1:注意事项
      3.0以前的Android 版本要使用FragmentActivity 来装载Fragment ,使用到support v4包。
      3.0以后的版本可以直接在Activity里面添加Fragment。
    2:Fragment也有生命周期,继承Fragment 要重新onCreateView方法,另外onResume,onDestroyView 等方法根据需要填写。
    重写onCreateView()方法:
    public class Fragment1 extends Fragment{

        @Override

        public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState){
        // Inflate the layout for this fragment
    return Inflater.inflate(
    R.layout.fragment1, container,  false);
        }

    }
    这里使用了LayoutInflater对象从指定的XML文件(本例中是R.layout.fragment1)来构造UI。container参数指定了父ViewGroup,即在其中嵌入该Fragment的活动。savedInstanceState参数使得能够将该Fragment恢复至之前保存的状态。

    3:在activity中加入Fragment有两种方法:布局和代码动态加入。布局加入和在布局加入view,button等用法一样。
    要想向活动中添加Fragment,需要使用<fragment>元素:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <fragment
    android:name=".Fragment1"
    android:id="@+id/fragment1"
        android:layout_weight="1"
    android:layout_width="0px"
    android:layout_height="match_parent" />
        <fragment
    android:name=".Fragment2"
    android:id="@+id/fragment2"
    android:layout_weight="1"

        android:layout_width="0px"
    android:layout_height="match_parent" />

    </LinearLayout>
    可注意到,每个Fragment都需要一个唯一标识符。可以通过android:id或android:tag属性指定。

    4:在Activity中动态加入Fragment google 教程http://developer.android.com/training/basics/fragments/fragment-ui.html

    // 创建一个Fragment实例
    HeadlinesFragment firstFragment = new HeadlinesFragment();
    firstFragment.setArguments(getIntent().getExtras());
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();

    5:一个Fragment替换另一个Fragment
    ArticleFragment newFragment = new ArticleFragment();
    //要传递给newFragment的信息,可以来自于其它Fragment
    Bundle args = new Bundle();
    args.putInt(ArticleFragment.ARG_POSITION, position);
    newFragment.setArguments(args);
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, newFragment);
    transaction.addToBackStack(“xxxxx”);//一个字符串标识
    transaction.commit();
    要想点击back可以返回上一个fragment ,transaction.addToBackStack(“xxxxx”);//一个字符串标识,这个必须有。

    6:Fragment 替换另一个Fragment时 数据传递
    例如:点击fragmentA 中的一个按钮 启动fragmentB ,FragmentActivity 是 activityFragment
    (1)通过Intent传递数据
    Intent  intent = new Intent();
    //把数据加入intent中
    intent.putExtra("xxx", xxx);
    intent.putExtra("xxx", xxx);    
    ......
    activityFragment .setIntent(intent);
    //启用事务,完成Fragment的转换。
    FragmentTransaction transaction = activityFragment.getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.xxx, fragmentB);
    //使用 add() 方法添加一个fragment
    transaction.add(R.id.fragment_container,fragment);
    add()的第一个参数是fragment要放入的ViewGroup, 由resource ID指定,第二个参数是需要添加的fragment。一旦用FragmentTransaction做了改变,为了使改变生效,必须调用commit()。
    //不将被替换的fragment加入栈中,点击返回调用系统默认的方法onBackPress()时不会返回上一个fragment
    transaction.addToBackStack("msg_fragment");
    transaction.commit();
    (2) 通过setfragment.setArguments(Bundle args)
    Bundle bundle = new Bundle();
    //往Bundle中放入数据
    Bundle.put(xxxx);
    .....
    fragmentB.setArgument();
    //启用事务,完成Fragment的转换。
    FragmentTransaction transaction = activityFragment.getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.xxx, fragmentB);
    //不将被替换的fragment加入栈中,点击返回调用系统默认的方法onBackPress()时不会返回上一个fragment
    transaction.addToBackStack("msg_fragment");
    transaction.commit();
    在fragmentB中 通过fragmentB.getArgument();方法获得Bundle,再取出数据。

    7:关于Context 的使用
    我在fragmentA创建一个自定义的dialog时 出现如下异常
    06-24 14:34:52.147: E/AndroidRuntime(4853): FATAL EXCEPTION: main
    06-24 14:34:52.147: E/AndroidRuntime(4853): java.lang.RuntimeException: Unable to resume activity {xxx}: java.lang.RuntimeException: Unable to resume activity {xxxxx.MsgActGroup}: java.lang.RuntimeException: Unable to resume activity {xxxx/com...MsgFragmentAct}: android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@4054d430 is not valid; is your activity running?
    情况是这样:fragmentActivity 是ActivityGroup的一个子Activity,fragmenA是fragmentActivity 的一个Fragment。这个异常可以翻译成:fragmentA现在还处于运行状态吗?
    可能是创建dialog时传入的context 即 fragmentA.getActivity() 即fragmentActivity 有问题。改成fragmentA.getActivity().getParent()。问题得到解决。

    参考链接:http://www.apkbus.com/forum.php?mod=viewthread&tid=122431

    Google 提供的教程:http://developer.android.com/training/basics/fragments/index.html

  • 相关阅读:
    idea 2019 1 spring boot 启动报错 An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
    MONGODB-LINUX 安装步骤
    MYSQL-LINUX 安装步骤
    虚拟机linux centos7 查找ip不到的设置
    Spring Boot (日志篇):Log4j2整合ELK,搭建实时日志平台
    spring boot跨域请求访问配置以及spring security中配置失效的原理解析
    Java设计模式:23种设计模式
    注解实现原理
    【Azure 环境】Windows中安装Python azure-eventhub-checkpointstoreblob-aio模块时出错 ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:
    【Azure微服务 Service Fabric 】Service Fabric中应用开启外部访问端口及微服务之间通过反向代理端口访问问题
  • 原文地址:https://www.cnblogs.com/klcf0220/p/3258719.html
Copyright © 2011-2022 走看看