官网地址:
http://developer.android.com/training/basics/fragments/index.html
一、创建一个Fragment
你可以认为一个Fragment是一个Activity的模块化区域。它有它自己生命周期,接收它自己的输入事件,你可以在Activity运行的时候动态添加和移除它。
1.1 创建一个Fragment类
和Activity一样,需要继承各自特有的父类(Fragment),然后重载它的生命周期函数,在函数中插入程序逻辑。
我没有看到有像创建一个Activity一样可以直接通过IDE直接创建的(new ->others -> android -> android activity),看来我们要从创建一个class开始了。new -> class 我们熟悉的节奏,这里我只添加了一个方法。里面都是自动生成的,我还没有写任何代码。
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ArticleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } }
1.2 用XML把Fragment添加到一个Activity中
首先我们新建一个layout文件,new -> other -> Android -> Android XML Layout File (new_articles.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/headlines_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:baselineAligned="false" > <fragment android:id="@+id/article_fragment" android:name="com.example.p6.ArticleFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="2" /> </LinearLayout>
因为Fragment是嵌入到Activity中的,所以我们需要一个特殊的Activity。
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.new_articles); } }
注意到和其它的不一样的是,我们已经把Layout修改为news_articles。同时,通过XML的形式将Fragment添加到Layout中的形式,不能在运行时灵活的移除它。
二、构造一个灵活的UI
当你为不同屏幕大小的android设备设计应用时,你可以重用你的Fragment在适应不同的设备。
官网上给出如下的图片来说明
2.1 运行时添加一个Fragment到一个Activity中
首先我们把我们之前添加到layout中的Fragment清空,并且LinerLayout 修改为FrameLayout res/layout/news_articles.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" />
这样 这个 Layout中没有任何东西了。接下来我们在代码中添加,修改MainActivity 中的onCreate()方法
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_articles); if (findViewById(R.id.fragment_container) != null) { if (savedInstanceState != null) { return; } ArticleFragment af = new ArticleFragment(); af.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, af).commit(); } } }
2.2 切换Fragment
我们需要另外一个Fragment来完成切换,ArticleFragment2
public class ArticleFragment2 extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } }
切换的时候和以前很像
ArticleFragment2 af2=new ArticleFragment2(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, af2); transaction.addToBackStack(null); transaction.commit();
三、 和其它Fragment进行交互
关于这一块官网上说的感觉有点乱,代码零零散散的。其实总结起来很简单。
核心方法在于如何在Activity中找到fragment和各种View,如何在Fragment中得到Activity
getActivity();//获得Activity getActivity().findViewById(R.id.receive_text);//获得View getFragmentManager().findFragmentById(R.id.ReceiveFragment);//获得Fragment
我这里自己写了一个例子,在一个Activity中包含两个Fragments,输入完之后点击第一个fragment中的按钮,第二个Fragment现实消息。
首先是layout
activity_man.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/headlines_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:baselineAligned="false" android:orientation="vertical" > <fragment android:id="@+id/SendFragment" android:name="com.tang.test.SendFragment" android:layout_width="match_parent" android:layout_height="200dp" /> <fragment android:id="@+id/ReceiveFragment" android:name="com.tang.test.ReceiveFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
send.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/headlines_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#FFC000" android:baselineAligned="false" android:orientation="vertical" > <EditText android:id="@+id/sendInput" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="text" > </EditText> <Button android:id="@+id/sendButtion" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/send" /> </LinearLayout>
receive.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/headlines_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#FFCC00" android:baselineAligned="false" > <TextView android:id="@+id/receive_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/receive" /> </LinearLayout>
然后是类
MainActivity
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
SendFragment
public class SendFragment extends Fragment { public static final String ARG_POSITION = "ARG_POSITION"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.send, container, false); } @Override public void onStart() { super.onStart(); Button button = (Button) getActivity().findViewById(R.id.sendButtion); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText inputText = (EditText) getActivity().findViewById( R.id.sendInput); ReceiveFragment receiveFragment = (ReceiveFragment) getFragmentManager() .findFragmentById(R.id.ReceiveFragment); receiveFragment.showText(inputText.getText().toString()); } }); } }
ReceiveFragment
public class ReceiveFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.receive, container, false); } public void showText(String text){ TextView textView = (TextView)getActivity().findViewById(R.id.receive_text); textView.setText(text); } }
代码这么详细,跑起来应该很简单了。哎,写这篇文章加上跑例子,要了大概5个小时。泪奔呀
相关推荐
在Android开发中,Fragment是一种可以被嵌入到Activity中的模块化组件,它有自己的生命周期,并且可以接收自己的输入事件。在运行时,开发者可以添加或移除Fragment,就像使用子Activity一样,可以在不同的Activity...
《使用Android Fragments创建动态UI》第二版是一本专注于Android平台的开发书籍,详细介绍了如何利用Android的Fragment组件构建出适应不同设备特性的动态用户界面。书籍内容不仅涵盖了Fragment的基本概念和使用方法...
Create engaging apps with fragments to provide a rich user interface that dynamically adapts to the individual characteristics of your customers' tablets and smartphones About This Book From an ...
基于Android框架的动态UI构建(Creating Dynamic UI with Android Fragments, 2nd Edition)-2016英文原版,0积分——该书是2016年最新的第2版,全书154页。
Long gone are the days of the mobile apps with a static UI squished onto a tiny screen. Today's users expect mobile apps to be dynamic and highly interactive. They expect an app to look fantastic when...
Long gone are the days of mobile apps with a static UI squished on a tiny screen. Today's users expect mobile apps to be dynamic and highly interactive. They expect an app to look fantastic when they ...
[Packt Publishing] Creating Dynamic UI with Android Fragments E Book ☆ 图书概要:☆ Leverage the power of Android fragments to develop dynamic user interfaces for your apps Overview Learn ...
- [Building a Dynamic UI with Fragments](https://developer.android.com/training/basics/fragments/creating.html) - [Fragments](https://developer.android.com/guide/components/fragments.html) 2. **...
通过以上六个章节的学习,读者不仅能够深入了解Fragments的核心概念和技术细节,还能掌握如何利用Fragments构建高质量的Android应用。无论是初学者还是经验丰富的开发者,都能够从中获得有价值的指导和启发。
9. **碎片(Fragments)**:碎片是Android 3.0引入的概念,允许在单个屏幕上展示多个UI部分。理解碎片的生命周期和与Activity的关系,对于开发适应不同屏幕尺寸的应用尤其重要。 10. **动画(Animations)**:...
在Android应用开发中,UI(用户界面)设计是至关重要的,因为它直接影响到用户的体验和应用的吸引力。Android UI开发专题涵盖了构建美观、易用且功能丰富的界面所需的关键知识点。以下是一些主要的Android UI开发...
综上所述,《构建图像碎片词典》这篇论文提出的自动构建图像碎片词典的方法,不仅提升了计算机视觉任务的性能,还开辟了图像处理的新途径,尤其是在图像分类、物体定位和创意应用方面展现了巨大的潜力。这种方法的...
Fragment是一个可嵌入到Activity中的UI组件,它允许开发者在不同屏幕尺寸上动态地组合和管理用户界面。在Android SDK 3.0中,对Fragment的使用和理解变得尤为重要。 首先,我们要了解Fragment的基本概念。Fragment...
Android UI Design:Plan, design, and build engaging user interfaces for your Android applications What You Will Learn Develop a user interface that adheres to all the core material design ...
Android Fragments 是Android开发中的一个重要概念,自Android 3.0(API级别11)引入,主要用于解决不同屏幕尺寸设备上的UI适配问题。Fragments 提供了一种灵活的方式来构建动态和可重构的用户界面,特别是在平板...
在Android应用开发中,Fragments是重要的组件,用于构建可重用、动态的用户界面,尤其是在平板电脑和大屏幕设备上。本示例"Android Fragments 使用的一些建议demo"提供了一些最佳实践,帮助开发者更高效地使用...