使用Fragment创建灵活的用户界面

 

什么是Fragment

        Fragment的作用像Activity一样,主要用于呈现用户界面,它依附于Activity存在,但比Activity更灵活。

当我们需要创建动态的,多面板的界面的时候就需要使用Fragment。

 

继承Fragment类

继承Fragment类,并覆盖相应的方法,就可以实现自己的Fragment类。 但是Fragment类是在Android 3.0添加的。

要在低于这个版本下使用Fragment,就需要导入v7 appcompat库。另外,Fragment的容器必须是FragmentActivity,

ActionBarActivity也可以,因为它继承于FragmentActivity。

在使用ActionBarActivity的时候,要想程序正常运行,程序的主题必须基于Theme.AppCompact,否则,程序崩溃。

如下:

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.Light" >
        <activity
            android:name="com.whathecode.usingfragment.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

 

程序布局:

 

示例代码

TitleFragment:

package com.whathecode.usingfragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class TitleFragment extends Fragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.thetitle, container, false);
    }
}

 

ContentFragment:

package com.whathecode.usingfragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ContentFragment extends Fragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.thecontent, container, false);
    }
}

 

上面两个Fragment类的代码基本一样,只是使用了不同的布局界面。

和Activity不一样的,Fragment是在onCreateView方法中嵌入界面,而Activity是在onCreate方法中使用setContentView方法设置界面布局。

 

activity_main界面代码

<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:orientation="horizontal"
    tools:context=".MainActivity" >

    <LinearLayout
        android:id="@+id/titleC"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="fill_parent"
        android:orientation="vertical"/>

    <LinearLayout
        android:id="@+id/contentC"
        android:layout_width="0dp"
        android:layout_weight="2"
        android:layout_height="fill_parent"
        android:orientation="vertical"/>

</LinearLayout>

 

材料都准备好后,最后一步就是将Fragment添加到Activity上面

package com.whathecode.usingfragment;

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity
{

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

        /**
         * 使用FragmentTransaction中的add方法将Fragment嵌入到当前的Activity上
         */
        FragmentManager supportFragmentManager = getSupportFragmentManager();

        FragmentTransaction transaction = supportFragmentManager.beginTransaction();

        //嵌入TitleFragment
        transaction.add(R.id.titleC, new TitleFragment());

        /**
         * 当所有的事务完成之后才能调用commit方法。
         * commit方法不能多次调用,否则程序崩溃
         */

        //嵌入ContentFragment
        transaction.add(R.id.contentC, new ContentFragment()).commit();
    }
}

 

运行效果:

 
Fragment间通讯

既然,Fragment是依附在Activity上面,那么它必然也是通过Activity作为媒介进行通讯。

假如我想在TitleFragment中获取ContentFragment中的内容,可以这样做:

1.  通过getActivity获得当前Activity的实例

2.  通过Activity的findViewById方法取得想要获取的View

 

示例代码:

package com.whathecode.usingfragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class TitleFragment extends Fragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.thetitle, container, false);
    }

    @Override
    public void onStart()
    {
        super.onStart();

        //获取界面中的Button按钮
        Button btn = (Button) getActivity().findViewById(R.id.getContent);

        //绑定onClick事件
        btn.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {

                //获取ContentFragment布局中的textView
                TextView txtView = (TextView) getActivity().findViewById(
                        R.id.content);

                //获取TextView中的文本内容
                String content = txtView.getText().toString();

                //显示内容
                Toast.makeText(getActivity(), content, Toast.LENGTH_SHORT)
                        .show();
            }
        });
    }
}

运行结果:

 

当然,这只是其中一种方法,也是不怎么好的方法。官方建议是在Fragment中定义一个接口,然后由Activity容器实现这个接口。

改良后的代码:

在TitleFragment中添加接口

package com.whathecode.usingfragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class TitleFragment extends Fragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.thetitle, container, false);
    }

    /**
     *
     * @author Administrator
     *新添加的接口,由Activity实现
     */
    public interface onGetContentListener
    {
        public void onGetContent();
    }
}
 

实现接口:

package com.whathecode.usingfragment;

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity implements
        TitleFragment.onGetContentListener
{
    FragmentManager supportFragmentManager = getSupportFragmentManager();
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * 使用FragmentTransaction中的add方法将Fragment嵌入到当前的Activity上
         */

        FragmentTransaction transaction = supportFragmentManager
                .beginTransaction();

        // 嵌入TitleFragment
        transaction.add(R.id.titleC, new TitleFragment());

        /**
         * 当所有的事务完成之后才能调用commit方法。 commit方法不能多次调用,否则程序崩溃
         */

        // 嵌入ContentFragment
        transaction.add(R.id.contentC, new ContentFragment()).commit();
    }

    /**
     * 只能在Fragment被嵌入到Activity后才能获取Fragment中的控件
     * 因此这里在onStart方法中实现逻辑代码
     */
    @Override
    protected void onStart()
    {
        super.onStart();

        Button btn = (Button) findViewById(R.id.getContent);

        btn.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                onGetContent();
            }
        });
    }

    /**
     * 实现TitleFragment中内部接口的方法
     */
    @Override
    public void onGetContent()
    {
        TextView txtView = (TextView) findViewById(R.id.content);
        Toast.makeText(this, txtView.getText().toString(), Toast.LENGTH_SHORT).show();
    }
}

运行效果和之前的一样,只是把逻辑都移到了Activity上

时间: 2024-10-24 15:48:17

使用Fragment创建灵活的用户界面的相关文章

Android UI开发——使用Fragment构建灵活的桌面

当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏.10寸屏等等,Android开发文档给了我们参考,而且Google  IO的app(如图二)也实现了这种思想,他们都是使用layout.layout-large里面不同的布局文件实现的.当设计应用程序,你可以在不同的布局结构中重复使用Fragment,以支持众多的屏幕尺寸,,在可用的屏幕空间上优化用户体验.例如在手持设备(如Nexus 4)上,一个屏显示一个Fragment,在更大屏(如Nexus 7)上可以使用多个Fr

【游戏科普】使用心理学法则创建优秀的用户界面

原文:GameDev =================================================================== 实践证明,心理学的法则可以适用于游戏的用户界面的设计. 当你开始设计游戏的用户界面时,无论它是一个等级选择菜单,或是游戏内的地图,或是生命条,都很重要.完美的UI设计是无形的,也就是说,用户并不是真的在与UI的工作机制进行拼杀 - 用户界面仿佛消失一般,而玩家专注于游戏中的世界. 我最喜欢的类比就是开车的时候.当你第一次学习如何驾驶时,你需

fragment创建

fragment创建一般有两种方法 一:xml创建 新建类继承Fragment,重写onCreateView()方法 在activity对应的xml, <fragment android:name=“” /> name为类继承Fragment的全名 二:Java代码创建 新建类继承Fragment,重写onCreateView()方法 在activity对应的xml,新建容器装 fragment  (我使用的FrameLayout) FragmentManager fragmentManage

Fragment创建及其生命周期

Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 创建片元(Creating a Fragment) To create a fragment, you must create a subclass of Fragment (or an existing subclass of it). The Fragment class has code that looks a lot like an Activit

Android UI开发第三十篇——使用Fragment构建灵活的桌面

摘要: 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏.10寸屏等等,Android开发文档给了我们参考,而且Google IO的app(如图二)也实现了这种思想,他们都是使用layout.layout-large里 ... 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏. 10寸屏等等,Android开发文档给了我们参考,而且Google IO的app(如图二)也实现了这种思想,他们都是使用layout.layout-large里面不同的

Android Fragment详解(二):Fragment创建及其生命周期

Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 创建片元(Creating a Fragment) To create a fragment, you must create a subclass of Fragment (or an existing subclass of it). The Fragment class has code that looks a lot like an Activit

Android成长之路(5)——利用Fragment创建一个动态的UI

简单的效果图如下: 现在利用碎片实现一个简单的动态UI,点击左边标题栏的标题,然后左边正文栏显示对应的文章 1.在activity_main.xml布局中添加两个Fragment. 一个对应左边的标题栏,一个对应右边的正文栏 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro

android 之fragment创建

1.使用xml标签 1.1定义两个重要属性  <fragment         android:id="@+id/fregment_top"        android:layout_width="match_parent"        android:layout_height="220dp"        android:layout_marginTop="80dp"        android:name=&

Creating a Fragment 创建一个片段

创建Fragment Class import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.ViewGroup; public class ArticleFragment extends Fragment { @Override public View onCreateView(LayoutInflater in