fragment(一)加载方式

阅读: 评论:0

fragment(一)加载方式

fragment(一)加载方式

                             

静态加载:

把fragment当成普通类来使用。

1.继承fragment类,重载fragment的onCreateView方法,此方法主要是创建fragment的布局。

2.在Activity的XMl文件中,通过fragment标签就可以使用我们自定义的fragment,这里通过指定fragment标签的name属性来确定使用哪一个Fragment。

例子:

 

ContentFragment的布局:

<FrameLayout xmlns:android=""
xmlns:tools=""
android:layout_width="match_parent"
android:layout_height="match_parent"
    android:background="@color/sport_items_bg"
tools:context=&#ample.liaoli.fragmentdemo.fragment.ContentFragment">

<TextView
    android:id="@+id/content"
    android:layout_width="wrap_content"
    android:gravity="center"
    android:layout_gravity="center"
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:text="@string/hello_blank_fragment"/>

</FrameLayout>

ContentFragment的代码:

ample.liaoli.fragmentdemo.fragment;import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;ample.liaoli.fragmentdemo.R;public class ContentFragment extends Fragment {private TextView title;public static ContentFragment newInstance(String param1, String param2) {ContentFragment fragment = new ContentFragment();return fragment;}public ContentFragment() {}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentView view = inflater.inflate(R.layout.fragment_content, container, false);title = (TextView) view.findViewById(R.id.content);title.setText("我是内容");return view ;}}

 

TitleFragment的布局文件:

 

<RelativeLayout xmlns:android=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="50dp"android:background="@color/entertainment_items_bg"tools:context=&#ample.liaoli.fragmentdemo.fragment.TitleFragment"><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="@string/hello_blank_fragment"android:textSize="25dp" /><Buttonandroid:id="@+id/share_bt"android:layout_width="60dp"android:layout_height="40dp"android:layout_centerVertical="true"android:layout_alignParentRight="true"android:text="分享"android:onClick="share"/>
</RelativeLayout>

 

 

TitleFragment的代码:

ample.liaoli.fragmentdemo.fragment;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;ample.liaoli.fragmentdemo.R;public class TitleFragment extends Fragment {private TextView title;public static TitleFragment newInstance(String param1, String param2) {TitleFragment fragment = new TitleFragment();return fragment;}public TitleFragment() {// Required empty public constructor}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentView view = inflater.inflate(R.layout.fragment_title, container, false);title = (TextView) view.findViewById(R.id.title);title.setText("我是标题");Button share = (Button) view.findViewById(R.id.share_bt);share.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getActivity(), "分享这篇文章", Toast.LENGTH_SHORT).show();}});return view ;}}

 

StaticLoadActivity的布局文件

<RelativeLayout xmlns:android=""xmlns: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=&#ample.liaoli.fragmentdemo.StaticLoadActivity"><fragmentandroid:id="@+id/title_fragment"android:layout_width="fill_parent"android:layout_height="wrap_content"android:name=&#ample.liaoli.fragmentdemo.fragment.TitleFragment"/><fragmentandroid:id="@+id/content_fragment"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_below="@+id/title_fragment"android:name=&#ample.liaoli.fragmentdemo.fragment.ContentFragment"/></RelativeLayout>

 

StaticLoadActivity的代码:

 

ample.liaoli.fragmentdemo;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;public class StaticLoadActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_static_load);}}

效果

 

 

 

 

二,动态加载

在程序的运行过程中动态的添加,删除,替换Fragment

 

TopNewsFragment的布局文件

<FrameLayout xmlns:android=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/top_item_bg"tools:context=&#ample.liaoli.fragmentdemo.fragment.TopNewsFragment"><TextViewandroid:id="@+id/content"android:layout_width="wrap_content"android:gravity="center"android:layout_gravity="center"android:layout_height="wrap_content"android:textSize="20dp"android:text="头条新闻条目列表" /></FrameLayout>

 

 

TopNewsFragment的代码:

ample.liaoli.fragmentdemo.fragment;import android.app.Activity;
import android.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;ample.liaoli.fragmentdemo.R;public class TopNewsFragment extends Fragment {public static TopNewsFragment newInstance(String param1, String param2) {TopNewsFragment fragment = new TopNewsFragment();return fragment;}public TopNewsFragment() {}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_top_news, container, false);}}

HotNewsFragment的布局

<FrameLayout xmlns:android=""xmlns:tools="" android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/hot_items_bg"tools:context=&#ample.liaoli.fragmentdemo.fragment.HotNewsFragment"><TextViewandroid:id="@+id/content"android:layout_width="wrap_content"android:gravity="center"android:layout_gravity="center"android:layout_height="wrap_content"android:textSize="20dp"android:text="热点新闻条目列表" /></FrameLayout>

 

HotNewsFragment的代码

ample.liaoli.fragmentdemo.fragment;import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;ample.liaoli.fragmentdemo.R;public class HotNewsFragment extends Fragment {public static HotNewsFragment newInstance(String param1, String param2) {HotNewsFragment fragment = new HotNewsFragment();return fragment;}public HotNewsFragment() {// Required empty public constructor}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_hot_news, container, false);}}

 

其他两个Fragment :EntertainmentFragment 和SportsFragment的代码和布局与上面两个几乎差不多,再次不在多说

DynamicLoadActivity的布局:

<LinearLayout xmlns:android=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=&#ample.liaoli.fragmentdemo.StaticLoadActivity"><FrameLayoutandroid:id="@+id/news_fragment"android:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="1"/><include layout="@layout/bottom_bar"/></LinearLayout>

l

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/bottom_bar_bg"android:orientation="horizontal"><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="头条"android:onClick="tops"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:onClick="hots"android:text="热点" /><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="娱乐"android:onClick="entertainments"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="体育"android:onClick="sports"/></LinearLayout>

 

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="bottom_bar_bg">#ff224e</color><color name="top_item_bg">#5477ff</color><color name="hot_items_bg">#dc97ff</color><color name="entertainment_items_bg">#ffd60d</color><color name="sport_items_bg">#21ff74</color>
</resources>

 

DynamicLoadActivity的代码:

ample.liaoli.fragmentdemo;import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;ample.liaoli.fragmentdemo.fragment.EntertainmentFragment;
ample.liaoli.fragmentdemo.fragment.HotNewsFragment;
ample.liaoli.fragmentdemo.fragment.SportsFragment;
ample.liaoli.fragmentdemo.fragment.TopNewsFragment;public class DynamicLoadActivity extends AppCompatActivity {private TopNewsFragment topNewsFragment;private HotNewsFragment hotNewsFragment;private EntertainmentFragmententertainmentFragment;private SportsFragment sportsFragment;@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_dynamic_load);initdata();}private void initdata() {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();if (topNewsFragment == null) {topNewsFragment = new TopNewsFragment();}fragmentTransaction.add(R.id.news_fragment, topNewsFragment);fragmentTransactionmit();}public void tops(View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();if (topNewsFragment == null) {topNewsFragment = new TopNewsFragment();}place(R.id.news_fragment, topNewsFragment);fragmentTransactionmit();}public void hots(View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();if (hotNewsFragment == null) {hotNewsFragment= new HotNewsFragment();}place(R.id.news_fragment, hotNewsFragment);fragmentTransactionmit();}public void entertainments(View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();if (entertainmentFragment == null) {entertainmentFragment= new EntertainmentFragment();}place(R.id.news_fragment, entertainmentFragment);fragmentTransactionmit();}public void sports(View view) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();if (sportsFragment == null) {sportsFragment= new SportsFragment();}place(R.id.news_fragment, sportsFragment);fragmentTransactionmit();}}

效果:

点击头条按钮

点击热点按钮:

点击娱乐按钮:

点击体育按钮

 

fragment常用的三个类

Fragment 封装了Fragment

FragmentManager 封装了Activity对Fragment的管理

FragmentTransaction 封装了对Fragment的事务处理流程

 

FragmentManager的获取方式

3.0以上getFragmentManager() 

v4中getSupportFragmentManager

FragmentTransaction 处理操作Fragment事物的方法如下

1.开启一个事务:

FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//开启一个事务

 

2.向Activity中添加fragment

abstract FragmentTransaction

add(int containerViewId, Fragment fragment)

Calls add(int, Fragment, String) with a null tag.

abstract FragmentTransaction

add(Fragment fragment, String tag)

Calls add(int, Fragment, String) with a 0 containerViewId.

fragmentTransaction.add(R.id.news_fragment, topNewsFragment);

 

3.删除一个fragment,如果被移除的Fragment没有添加到回退栈中,这个Fragment实例将被销毁。

abstract FragmentTransaction

remove(Fragment fragment)

Remove an existing fragment.

4.隐藏一个Fragment

 此时仅仅是不可见,而并没有被销毁

abstract FragmentTransaction

hide(Fragment fragment)

Hides an existing fragment.

5.显示之前隐藏的Fragment

abstract FragmentTransaction

show(Fragment fragment)

Shows a previously hidden fragment.

6.将view从UI中移除

此方法跟Remove不一样,此时Fragment还是有FragmentManager维护管理

abstract FragmentTransaction

detach(Fragment fragment)

Detach the given fragment from the UI.

7.重建Fragment的View布局,并附添加到UI并显示出来

abstract FragmentTransaction

attach(Fragment fragment)

Re-attach a fragment after it had previously been detached from the UI with detach(Fragment).

8.替换Fragment,通过源码我们会知道,其实就是先删除,在添加

abstract FragmentTransaction

replace(int containerViewId, Fragment fragment, String tag)

Replace an existing fragment that was added to a container.

abstract FragmentTransaction

replace(int containerViewId, Fragment fragment)

Calls replace(int, Fragment, String) with a null tag.

在一个事务的开启到提交的过程中可以多次添加、移除、替换等相关操作。

在我们使用Fragment的过程中一定要弄清楚事务处理的各个方法那些会销毁视图,那些会销毁Fragment实例。

常见错误:State loss这样的错误。主要是因为:commit方法一定要在SaveInstance()之前调用。

本文发布于:2024-01-31 00:53:17,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170663370924122.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:加载   方式   fragment
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23