zoukankan      html  css  js  c++  java
  • Android学习笔记_46_fragment的简单应用

       Fragments 诞生初衷

         http://www.cnblogs.com/TerryBlog/archive/2012/02/17/2355753.html

      自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments 。fragments 的设计不需要你来亲自管理view hierarchy 的复杂变化,通过将Activity 的布局分散到frament 中,可以在运行时修改activity 的外观,并且由activity 管理的back stack 中保存些变化。

     

          Fragments 设计理念

          在设计应用时特别是Android 应用 ,有众多的分辨率要去适应,而fragments 可以让你在屏幕不同的屏幕上动态管理UI。例如:通讯应用程序(QQ),用户列表可以在左边,消息窗口在右边的设计。而在手机屏幕用户列表填充屏幕当点击某一用户时,则弹出对话窗口的设计,如下图:

     

    Fragments的生命周期 

        每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件。 对应生命周期可参考下图:

     

     其中大多数程序必须使用Fragments 必须实现的三个回调方法分别为:

    onCreate

       系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。 

    onCreateView

       用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。 

    onPause 

        当用户离开这个Fragments 的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。更多的事件可以参考上图的生命周期关系图。

    Fragments 的类别

        系统内置了三种Fragments ,这三种Fragments 分别有不同的应用场景分别为:

    DialogFragment

     对话框式的Fragments,可以将一个fragments 对话框并到activity 管理的fragments back stack 中,允许用户回到一个前曾摒弃fragments.

    ListFragments

       类似于ListActivity 的效果,并且还提供了ListActivity 类似的onListItemCLick和setListAdapter等功能。

    PreferenceFragments

       类似于PreferenceActivity .可以创建类似IPAD的设置界面。 

     

    Fragments 的详细使用 

        首先先来看一张DEMO 效果图:

      使用:

    1、创建两个fragment布局文件:                                                                                                    

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:background="#00ff00"
        tools:context=".MainActivity" >
    
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="90dp"
            android:layout_marginTop="16dp"
            android:text="切换" />
    
    </RelativeLayout>

    fragment2

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:background="#ffff00"
        tools:context=".MainActivity" >
    
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="改变背景色" 
            android:textColor="#ff00ff"
            />
       
    </RelativeLayout>

    main.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    <!-- 使用xml方式实现fragment  -->
        <fragment
            android:id="@+id/fragment1"
            android:name="com.example.fragment.Fragment1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    
        <fragment
            android:id="@+id/fragment2"
            android:name="com.example.fragment.Fragment2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    
    </LinearLayout>

    2、创建fragment类,继承Fragment类:

    package com.example.fragment;
    
    
    import android.app.Fragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class Fragment1 extends Fragment {
        
        /**
         * 当fragment被创建的时候调用的方法,返回当前fragment显示的内容
         */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            //获取fragment1布局填充器
            View view = inflater.inflate(R.layout.fragment1, null);
            //获取fragment1上的button
            Button button = (Button) view.findViewById(R.id.button1);
            button.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //通过获取activity的FragmentManager找到fragment2
                    Fragment2 fragment = (Fragment2) getActivity().getFragmentManager().findFragmentById(R.layout.fragment2);
                    fragment.setText("内容被改变了...");
                    System.out.println("Fragment1 button click .... "+fragment);
                }
            });
            return view;
        }
        
    }
    package com.example.fragment;
    
    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 Fragment2 extends Fragment {
        private TextView textView;
        
        /**
         * 当fragment被创建的时候调用的方法,返回当前fragment显示的内容
         */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment2, null);
            textView = (TextView) view.findViewById(R.id.textView1);
            return view;
        }
        
        public void setText(String text){
            System.out.println("Fragment2 text respond .... ");
            textView.setText(text);
        }
    }
    package com.example.fragment;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.app.FragmentManager;
    import android.app.FragmentTransaction;
    import android.view.Menu;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            //dynamicFragment();
        }
    
        /**
         * 通过代码动态切换fragment
         */
        private void dynamicFragment() {
            //动态创建fragment
            int width = getWindowManager().getDefaultDisplay().getWidth();
            int height = getWindowManager().getDefaultDisplay().getHeight();
            
            Fragment1 fragment1 = new Fragment1();
            Fragment2 fragment2 = new Fragment2();
            
            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            
            if(width>height){
                //水平方向
                ft.replace(android.R.id.content, fragment1);
            }else {
                ft.replace(android.R.id.content, fragment2);
            }
            ft.commit();
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        
    }

      上面的代码主要包含了fragment的动态创建(dynamicFragment方法)和两个fragment之间的通信。

     

     

     

     

     

  • 相关阅读:
    课堂作业04 2017.10.27
    课程作业 03 动手动脑 2017.10.20
    课程作业 03 2017.10.20
    HDU 3974 Assign the task
    POJ 2155 Matrix
    POJ 2481 Cows
    HDU 3038 How Many Answers Are Wrong
    CS Academy Array Removal
    POJ_1330 Nearest Common Ancestors LCA
    CF Round 427 D. Palindromic characteristics
  • 原文地址:https://www.cnblogs.com/lbangel/p/3504851.html
Copyright © 2011-2022 走看看