Android Fragment使用详解

合集下载

Android Fragment 真正的完全解析

Android Fragment 真正的完全解析

Android Fragment 真正的完全解析(上)转载请标明出处:/lmj623565791/article/details/37970961自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragment谈上关系,做什么都要问下Fragment能实现不~~~哈哈,是不是有点过~~~本篇博客力求为大家说明Fragment如何产生,什么是Fragment,Fragment生命周期,如何静态和动态的使用Fragment,Fragment回退栈,Fragment事务;以及Fragment的一些特殊用途,例如:没有布局的Fragment有何用处?Fragment如何与Activity交互?Fragment如何创建对话框?Fragment如何与ActionBar集成等等。

1、Fragment的产生与介绍Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。

针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的。

难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊。

Fragment的出现就是为了解决这样的问题。

你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。

更为重要的是,你可以动态的添加、替换和移除某个Fragment。

2、Fragment的生命周期Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment 的生命周期。

官网这张图很好的说明了两者生命周期的关系:可以看到Fragment比Activity多了几个额外的生命周期回调方法:onAttach(Activity)当Fragment与Activity发生关联时调用。

fragement详解

fragement详解

fragement详解Fragment(片段)是编程中的一个概念,指的是在Android开发中可以独立存在的模块化组件。

相较于Activity(活动),Fragment有更好的灵活性、可重用性和扩展性。

本文将详细解释Fragment的定义、使用方法、生命周期、与Activity的关系等内容,以帮助读者深入了解Fragment的优点和实践。

第一部分:Fragment定义和使用方法一、Fragment定义Fragment是Android提供的一种用户界面组件,可以嵌入到Activity中进行布局和交互。

每个Fragment都有自己的生命周期,可以独立接收用户输入、响应事件、更新UI等。

Fragment可以看作是一种轻量级的Activity,但与Activity不同的是,Fragment必须依附于一个Activity才能使用。

二、Fragment使用方法要在项目中使用Fragment,首先需要确保你的项目使用了适当的版本和依赖库。

在Android Studio中,可以在build.gradle 文件中添加以下代码来引入Fragment支持:```implementation 'androidx.fragment:fragment:1.3.0'```然后,在XML布局文件中定义Fragment的容器。

在Activity 中可以添加一个`<FrameLayout>`元素作为容器,如下所示:```<FrameLayoutandroid:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="match_parent" />```接着,在Activity中实例化一个Fragment对象,并将其添加到容器中。

详解Android开发中Fragment的使用

详解Android开发中Fragment的使用

详解Android开发中Fragment的使⽤前⾔学习Java和Android将近⼀年的时间了,期间的成果应该就是独⽴完成了⼀个Android客户端,并且保证了其在主线版本的稳定性。

期间遇到了很多坑,也跟着师兄学到了很多Android知识。

但是⼈总是要拥抱变化,不能让⾃⼰太安逸,虽然有不舍,但是我已经证明了⾃⼰的学习能⼒,下⼀步就是开始做Rom Porting了。

这⾥总结⼀下之前项⽬中⽤到最多的Fragment。

Fragment简介Fragment可以理解成Activity中⽤户界⾯的⼀个⾏为或者⼀部分,它必须被嵌套在Activity中。

但是⼀个Fragment有它⾃⼰独⽴的xml布局⽂件,并且具有良好的封装性,因此特殊情况下Fragment可以很容易⽤Activity来进⾏替换。

创建Fragment创建⼀个Fragment和创建Activity类似,需要实现XML布局⽂件和Java Class。

XML布局⽂件和其他布局⽂件都⼀样,例如如下所⽰的布局⽂件(fragment_layout.xml):<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/testview" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button" /></LinearLayout>Java代码中,⼀般情况下可以根据需要实现Fragment以下⼏个⽣命周期⽅法:1. onAttach():当Fragment依附于activity时被调⽤,可以在该⽅法中获取activity句柄,从⽽实现Fragment和activity之间的通信。

android中关于fragment用法

android中关于fragment用法

安卓中关于Fragment用法小结首先,新建安卓工程,在AndroidManifest.xml文件中,根据<activityandroid:name=".MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="UNCHER"/></intent-filter></activity>中android:name=".MainActivity",找到程序进入的主类,该类继承继承自FragmentActivity 方法。

在onCreate()中引入setContentView(yout.activity_main);其次,在activity_main.xml中创建3个类似<fragmentandroid:id="@+id/fragment_home"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"class="com.eoe.tampletfragment.fragment.HomeFragment"/>标签,其中class表示该标签引用的类路径。

Id表示该标签的唯一标示。

在HomeFragment.java页面中,Fragment一般作为activity的用户界面的一部分,把自己的layout嵌入到activity的layout中,一个要为fragment提供layout,必须实现onCreateView()方法,然后再这个方法中返回一个View对象。

fragment 用法

fragment 用法

Fragment在Android开发中具有重要地位,它表示Activity中的行为或界面的一部分,可以在一个Activity中组合多个Fragment,构建多窗格界面,并在多个Activity中重复使用某个Fragment。

Fragment必须始终托管在Activity中,其生命周期直接受宿主Activity生命周期的影响。

例如,当Activity暂停时,Activity的所有Fragment也会暂停;当Activity被销毁时,所有Fragment也会被销毁。

不过,当Activity正在运行时(处于已恢复生命周期状态),可以独立操纵每个Fragment,如添加或移除Fragment。

当执行此类Fragment事务时,也可将其添加到由Activity管理的返回栈中——Activity中的每个返回栈条目都是一条已发生Fragment事务的记录。

借助返回栈,用户可以通过按返回按钮撤消Fragment事务(后退)。

在实现上,Fragment类包含与Activity类似的回调方法,如onCreate()、onStart()、onPause()和onStop()。

通常至少应实现以下生命周期方法:onCreate()系统会在创建Fragment时调用此方法。

当Fragment经历暂停或停止状态继而恢复后,如果希望保留此Fragment的基本组件,则应在实现中将其初始化。

onCreateView()系统会在Fragment首次绘制其界面时调用此方法。

如要为Fragment绘制界面,从此方法中返回的View必须是Fragment布局的根视图。

以上信息仅供参考,如有需要,建议查阅Android开发相关文档或咨询专业开发人员。

调用fragment 方法

调用fragment 方法

调用fragment 方法调用Fragment方法是在Android开发中常用的一种技术,用于创建动态UI 和模块化的设计。

Fragment是Android SDK中的一个组件,用于构建模块化的UI界面,并可以嵌入到Activity中使用。

在本文中,我将详细介绍Fragment 的使用和调用方法,帮助读者更好地理解和应用这一技术。

首先,我们来了解一下Fragment的概念和作用。

Fragment是Android提供的一种组件,用于构建灵活的用户界面。

与Activity一样,Fragment也有自己的布局,生命周期和用户交互事件。

但与Activity不同的是,Fragment可以嵌套在Activity中使用,允许多个Fragment共享同一个Activity界面。

这种模块化的UI设计使得应用更加灵活和可扩展。

调用Fragment方法主要包括以下几个步骤:1. 创建Fragment类:首先需要定义一个继承自Fragment的类,作为我们自定义的Fragment。

在这个类中,我们可以定义和实现自己的布局和逻辑。

通常,我们需要重写onCreateView方法,在该方法中加载并返回Fragment所使用的布局。

2. 在布局文件中添加Fragment:在Activity的布局文件中,我们可以使用<fragment>标签来添加一个Fragment。

需要注意的是,我们需要在<fragment>标签中指定Fragment的类名,以及其他属性和参数。

3. 在Activity中管理Fragment:在Activity的Java代码中,我们可以使用FragmentManager来管理Fragment。

通过FragmentManager,我们可以动态添加、替换或移除Fragment,以及处理Fragment的生命周期和交互事件。

4. Fragment之间的通信:在应用中,不同的Fragment之间可能需要相互通信,以实现数据共享或事件传递。

Fragment中各个方法的使用场景

Fragment中各个方法的使用场景

Fragment中各个方法的使用场景在Android开发中,Fragment是一种重要的组件,用于构建灵活的用户界面。

Fragment类中包含了许多方法,每个方法都有不同的使用场景。

以下是Fragment中各个方法的使用场景:1. onAttach(:在Fragment与Activity关联时调用。

可以在此方法中获取Activity的引用,进行必要的初始化操作。

2. onCreate(:在Fragment被创建时调用。

通常在此方法中进行一些初始化工作,例如初始化数据、获取传递的参数等。

3. onCreateView(:创建Fragment的用户界面视图。

可以在此方法中使用布局文件定义Fragment的UI,或者通过代码动态创建UI。

4. onViewCreated(:当Fragment的视图已经创建时调用。

可以在此方法中对视图进行进一步的初始化,例如绑定事件监听器、设置适配器等。

5. onActivityCreated(:当Fragment所在的Activity已经创建时调用。

可以在此方法中进行与Activity相关的初始化操作,例如获取Activity的引用、调用Activity的方法等。

6. onStart(:当Fragment可见时调用。

可以在此方法中执行一些必要的操作,例如开始动画、启动定时任务等。

7. onResume(:当Fragment获取焦点并可与用户进行交互时调用。

可以在此方法中执行一些与用户交互相关的操作,例如注册广播接收器、绑定服务等。

8. onPause(:当Fragment失去焦点或即将停止与用户交互时调用。

可以在此方法中执行一些与用户交互相关的操作的释放,例如取消注册广播接收器、解绑服务等。

9. onStop(:当Fragment不再可见时调用。

可以在此方法中执行一些必要的操作,例如停止动画、取消定时任务等。

10. onDestroyView(:当Fragment的视图被销毁时调用。

fragment用法详解

fragment用法详解

fragment用法详解一、Fragment简介Fragment是Android开发中一个重要的组件,它提供了一种在Activity或Fragment之间共享用户界面的方式。

Fragment可以独立地加载和更新,而不需要重新创建整个Activity或Fragment。

这使得Fragment在处理复杂的用户界面和交互时非常有用。

二、Fragment生命周期Fragment的生命周期与Activity相似,但也存在一些特殊之处。

Fragment的生命周期包括以下阶段:1. 创建阶段:当Fragment被添加到Activity中时,会进入创建阶段。

这个阶段包括Fragment的实例被创建,以及相关数据被初始化。

2. 活动阶段:Fragment与Activity一起活动,包括用户交互和更新等。

3. 销毁阶段:当Activity或Fragment不再需要时,会进入销毁阶段。

这个阶段包括Fragment的内部状态被保存,以及相关的资源被释放。

Fragment还提供了自己的生命周期回调方法,如onCreateView()和onDestroyView(),用于控制Fragment与视图树的交互。

下面是一个简单的Fragment用法示例:1. 在布局文件中添加Fragment元素:在布局文件中,可以使用<fragment>元素将Fragment添加到Activity中。

2. 在Activity中获取Fragment实例:在Activity中,可以使用getSupportFragmentManager()方法获取FragmentManager实例,然后使用findFragmentById()方法获取指定ID的Fragment实例。

3. 更新Fragment内容:可以使用setRetainInstance(true)方法保留Fragment实例,以便在Activity重新创建时保留Fragment的状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Fragment(一)1. 继承关系ng.Object|__android.app.Fragment实现接口:ComponentCallbacks2 View.OnCreateContextMenuListener引入版本:API Level 11已知的子类:DialogFragment、ListFragment、PreferenceFragment、WebViewFragment2. 类概要一个Fragment是应用程序的用户界面或行为的一个片段,它能够被放置在一个Activity中。

通过FragmentManager对象来实现与Fragment对象的交互,能够通过Activity.getFragmentManager()方法和Fragment.getFragmentManager()方法来获取FragmentManager对象。

Fragment类有着广泛的应用,它的核心是代表了一个正在较大的Activity中运行的特俗的操作或界面。

Fragment对象跟它所依附的Activity对象是紧密相关的,并且不能被分开使用。

尽管Fragment对象定义了它们自己的生命周期,但是这个生命周期要依赖与它所在的Activity:如果该Activity被终止,那么它内部的Fragment是不能被启动的;当Activity被销毁时,它内部的所有Fragment对象都会被销毁。

所有的Fragment子类都必须包含一个公共的空的构造器。

在需要的时候,Framework 会经常重新实例化Fragment类,在特殊的状态恢复期间,需要能够找到这个构造器来实例化Fragment类。

如果空的构造器无效,那么在状态恢复期间会导致运行时异常发生。

较旧的平台尽管Fragment API是在HONEYCOMB版本中被引入的,但是通过FragmentActivity也能够在较旧的平台上使用该API。

声明周期尽管Fragment对象的生命周期要依附于它所在的Activity对象,但是它也有自己标准的活动周期,它包含了基本的活动周期方法,如onResume(),但是同时也包含了与Activity 和UI交互相关的重要方法。

显示Fragment时(跟用户交互)要调用的核心的生命周期方法如下:1. 把Fragment对象跟Activity关联时,调用onAttach(Activity)方法;2. Fragment对象的初始创建时,调用onCreate(Bundle)方法;3. onCreateView(LayoutInflater, ViewGroup, Bundle)方法用于创建和返回跟Fragment关联的View对象;4. onActivityCreate(Bundle)方法会告诉Fragment对象,它所依附的Activity对象已经完成了Activity.onCreate()方法的执行;5. onStart()方法会让Fragment对象显示给用户(在包含该Fragment对象的Activity 被启动后);6. onResume()会让Fragment对象跟用户交互(在包含该Fragment对象的Activity 被启恢复后)。

Fragment对象不再使用时,要反向回调的方法:1. 因为Fragment对象所依附的Activity对象被挂起,或者在Activity中正在执行一个修改Fragment对象的操作,而导致Fragment对象不再跟用户交互时,系统会调用Fragment对象的onPause()方法;2. 因为Fragment对象所依附的Activity对象被终止,或者再Activity中正在执行一个修改Fragment对象的操作,而导致Fragment对象不再显示给用户时,系统会调用Fragment对象的onStop()方法。

3. onDestroyView()方法用于清除跟Fragment中的View对象关联的资源;4. Fragment对象的状态被最终清理完成之后,要调用onDestroy()方法;5. 在Fragment对象不再跟它依附的Activity关联的时候,onDetach()方法会立即被调用。

布局Fragment对象能够被用于应用程序的布局,它会让代码的模块化更好,并且针对Fragment所运行的屏幕,让用户界面的调整更加容易。

例如,一个简单的由项目列表和项目明细表示所组成的程序。

一个Activity的布局XML能够包含要嵌入到布局内部的Fragment实例的<fragment>标签。

例如,下例中在布局中嵌入了一个Fragment对象:<FrameLayout xmlns:android="/apk/res/android"android:layout_width="match_parent" android:layout_height="match_parent"> <fragmentclass="com.example.android.apis.app.FragmentLayout$TitlesFragment"android:id="@+id/titles"android:layout_width="match_parent"android:layout_height="match_parent" /></FrameLayout>以下是布局被安装到Activity中的通常方法:@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.fragment_layout);}依赖ListFragment对象,要显示列表的标题是相当简单的。

要注意的是,点击一个列表项的实现,会依赖当前Activity的布局,它既可以创建一个新的Fragment用于显示该项目的明细,也可以启动一个新的Activity用于显示项目的明细。

public static class TitlesFragment extends ListFragment {boolean mDualPane;int mCurCheckPosition = 0;@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);// Populate list with our static array of titles.setListAdapter(new ArrayAdapter<String>(getActivity(),yout.simple_list_item_activated_1,Shakespeare.TITLES));// Check to see if we have a frame in which to embed the details // fragment directly in the containing UI.View detailsFrame = getActivity().findViewById(R.id.details);mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;if (savedInstanceState != null) {// Restore last state for checked position.mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);}if (mDualPane) {// In dual-pane mode, the list view highlights the selected item. getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);// Make sure our UI is in the correct state.showDetails(mCurCheckPosition);}}@Overridepublic void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putInt("curChoice", mCurCheckPosition);}@Overridepublic void onListItemClick(ListView l, View v, int position, long id) {showDetails(position);}/*** Helper function to show the details of a selected item, either by* displaying a fragment in-place in the current UI, or starting a* whole new activity in which it is displayed.*/void showDetails(int index) {mCurCheckPosition = index;if (mDualPane) {// We can display everything in-place with fragments, so update// the list to highlight the selected item and show the data.getListView().setItemChecked(index, true);// Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment)getFragmentManager().findFragmentById(R.id.details);if (details == null || details.getShownIndex() != index) {// Make new fragment to show this selection.details = DetailsFragment.newInstance(index);// Execute a transaction, replacing any existing fragment // with this one inside the frame.FragmentTransaction ft = getFragmentManager().beginTransaction();ft.replace(R.id.details, details);ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);mit();}} else {// Otherwise we need to launch a new activity to display// the dialog fragment with selected text.Intent intent = new Intent();intent.setClass(getActivity(), DetailsActivity.class);intent.putExtra("index", index);startActivity(intent);}}}明细Fragment对象只会显示所选项目的详细文本字符串,它是基于内置在应用中的一个字符数组的索引来获取的:public static class DetailsFragment extends Fragment {/*** Create a new instance of DetailsFragment, initialized to* show the text at 'index'.*/public static DetailsFragment newInstance(int index) {DetailsFragment f = new DetailsFragment();// Supply index input as an argument.Bundle args = new Bundle();args.putInt("index", index);f.setArguments(args);return f;}public int getShownIndex() {return getArguments().getInt("index", 0);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {if (container == null) {// We have different layouts, and in one of them this// fragment's containing frame doesn't exist. The fragment// may still be created from its saved state, but there is// no reason to try to create its view hierarchy because it// won't be displayed. Note this is not needed -- we could// just run the code below, where we would create and return// the view hierarchy; it would just never be used.return null;}ScrollView scroller = new ScrollView(getActivity());TextView text = new TextView(getActivity());int padding = (int)TypedValue.applyDimension(PLEX_UNIT_DIP,4, getActivity().getResources().getDisplayMetrics());text.setPadding(padding, padding, padding, padding);scroller.addView(text);text.setText(Shakespeare.DIALOGUE[getShownIndex()]);return scroller;}}在用户点击标题的情况下,在当前的Activity中没有明细容器,因此标题Fragment 的点击事件代码会启动一个新的显示明细Fragment的Activity:public static class DetailsActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getResources().getConfiguration().orientation== Configuration.ORIENTATION_LANDSCAPE) {// If the screen is now in landscape mode, we can show the// dialog in-line with the list so we don't need this activity.finish();return;}if (savedInstanceState == null) {// During initial setup, plug in the details fragment.DetailsFragment details = new DetailsFragment();details.setArguments(getIntent().getExtras());getFragmentManager().beginTransaction().add(android.R.id.content, details).commit();}}}但是,屏幕可能足够显示标题列表和当前所选标题相关的明细。

相关文档
最新文档