2. 了解使用Fragment 有自己的生命周期
Fragment 依赖于 Activity
Fragment 通过 getActivity() 可以获取所在的 Activity; Activity 通过 FragmentManager 的 findFragmentByID()
或 findFragmentByTag() 获取 FragmentFragment 和 Activity 是多对多的关系
Activity 嵌一个 Fragment, 点击按钮切换另一个.
ContainerActivity 文件
package com.example.hello.fragment;import androIDx.appcompat.app.AppCompatActivity;import androIDx.fragment.app.Fragment;import androID.os.Bundle;import androID.Widget.button;import com.example.hello.R;public class ContainerActivity extends AppCompatActivity { private AFragment aFragment; private BFragment bFragment; private button btnChange; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_container); btnChange = findVIEwByID(R.ID.btn_change_fragment); btnChange.setonClickListener(v -> { // 切换 if (bFragment == null) { bFragment = new BFragment(); } // 防止实例 Fragment fragment = getSupportFragmentManager().findFragmentByTag("a"); if (fragment != null) { getSupportFragmentManager().beginTransaction().hIDe(fragment).add(R.ID.content_fragment, bFragment).addToBackStack(null).commitAllowingStateLoss(); } else { getSupportFragmentManager().beginTransaction().replace(R.ID.content_fragment, bFragment).addToBackStack(null).commitAllowingStateLoss(); } }); // 实例化 aFragment = new AFragment("参数"); // 将 aFragment 放入到 Activity 中 getSupportFragmentManager().beginTransaction().add(R.ID.content_fragment, aFragment, "a").commitAllowingStateLoss(); }}
activity_container.xml
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:app="http://schemas.androID.com/apk/res-auto" xmlns:tools="http://schemas.androID.com/tools" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" androID:padding="15dp" tools:context=".fragment.ContainerActivity"> <button androID:ID="@+ID/btn_change_fragment" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:text="@string/changeFragment" /> <FrameLayout androID:ID="@+ID/content_fragment" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" /></linearLayout>
AFragment
package com.example.hello.fragment;import androID.os.Bundle;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.TextVIEw;import androIDx.annotation.NonNull;import androIDx.annotation.Nullable;import androIDx.fragment.app.Fragment;import com.example.hello.R;public class AFragment extends Fragment { private TextVIEw tvA; @Nullable @OverrIDe public VIEw onCreateVIEw(@NonNull LayoutInflater inflater, @Nullable VIEwGroup container, @Nullable Bundle savedInstanceState) { super.onCreateVIEw(inflater, container, savedInstanceState); return inflater.inflate(R.layout.fragment_a, container, false); } @OverrIDe public voID onVIEwCreated(@NonNull VIEw vIEw, @Nullable Bundle savedInstanceState) { super.onVIEwCreated(vIEw, savedInstanceState); tvA = vIEw.findVIEwByID(R.ID.fragment_tv); }}
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" androID:padding="15dp"> <TextVIEw androID:ID="@+ID/fragment_tv" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:gravity="center" androID:text="@string/fragmentA" androID:textcolor="@color/black" androID:textSize="20sp" /></linearLayout>
BFragment
package com.example.hello.fragment;import androID.os.Bundle;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.TextVIEw;import androIDx.annotation.NonNull;import androIDx.annotation.Nullable;import androIDx.fragment.app.Fragment;import com.example.hello.R;public class BFragment extends Fragment { private TextVIEw tvB; @Nullable @OverrIDe public VIEw onCreateVIEw(@NonNull LayoutInflater inflater, @Nullable VIEwGroup container, @Nullable Bundle savedInstanceState) { super.onCreateVIEw(inflater, container, savedInstanceState); return inflater.inflate(R.layout.fragment_b, container, false); } @OverrIDe public voID onVIEwCreated(@NonNull VIEw vIEw, @Nullable Bundle savedInstanceState) { super.onVIEwCreated(vIEw, savedInstanceState); tvB = vIEw.findVIEwByID(R.ID.fragment_tv); }}
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" androID:padding="15dp"> <TextVIEw androID:ID="@+ID/fragment_tv" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:gravity="center" androID:text="@string/fragmentB" androID:textcolor="@color/black" androID:textSize="20sp" /></linearLayout>
向 Fragment 传递参数.
新版本的可以用构造函数.
// 实例化 aFragment = new AFragment("参数");
AFragment
package com.example.hello.fragment;import androID.content.Context;import androID.os.Bundle;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.TextVIEw;import androIDx.annotation.NonNull;import androIDx.annotation.Nullable;import androIDx.fragment.app.Fragment;import com.example.hello.R;public class AFragment extends Fragment { private TextVIEw tvA; private String Title; public AFragment(String Title) { this.Title = Title; } public AFragment() { } @Nullable @OverrIDe public VIEw onCreateVIEw(@NonNull LayoutInflater inflater, @Nullable VIEwGroup container, @Nullable Bundle savedInstanceState) { super.onCreateVIEw(inflater, container, savedInstanceState); return inflater.inflate(R.layout.fragment_a, container, false); } @OverrIDe public voID onVIEwCreated(@NonNull VIEw vIEw, @Nullable Bundle savedInstanceState) { super.onVIEwCreated(vIEw, savedInstanceState); tvA = vIEw.findVIEwByID(R.ID.fragment_tv); if (Title != null) { tvA.setText(Title); } } @OverrIDe public voID onAttach(@NonNull Context context) { super.onAttach(context); } @OverrIDe public voID onDetach() { super.onDetach(); }}
4. Fragment 和 Activity 的通信AFragment 文件
package com.example.hello.fragment;import androID.content.Context;import androID.os.Bundle;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.button;import androID.Widget.TextVIEw;import androIDx.annotation.NonNull;import androIDx.annotation.Nullable;import androIDx.fragment.app.Fragment;import com.example.hello.R;public class AFragment extends Fragment { private TextVIEw tvA; private button btnChangeContent; private String Title; private ChangeContent changeContent; public AFragment(String Title) { this.Title = Title; } public AFragment() { } @Nullable @OverrIDe public VIEw onCreateVIEw(@NonNull LayoutInflater inflater, @Nullable VIEwGroup container, @Nullable Bundle savedInstanceState) { super.onCreateVIEw(inflater, container, savedInstanceState); return inflater.inflate(R.layout.fragment_a, container, false); } @OverrIDe public voID onVIEwCreated(@NonNull VIEw vIEw, @Nullable Bundle savedInstanceState) { super.onVIEwCreated(vIEw, savedInstanceState); tvA = vIEw.findVIEwByID(R.ID.fragment_tv); if (Title != null) { tvA.setText(Title); } btnChangeContent = vIEw.findVIEwByID(R.ID.btn_change_content); btnChangeContent.setonClickListener(v -> { changeContent.setContent("改变的内容"); }); } @OverrIDe public voID onAttach(@NonNull Context context) { super.onAttach(context); try { // 没有实现该接口会报错 changeContent = (ChangeContent) context; } catch (Exception e) { e.printstacktrace(); } } @OverrIDe public voID onDetach() { super.onDetach(); } /** * 通信 */ public interface ChangeContent { voID setContent(String Title); }}
fragment_a.xml
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" androID:padding="15dp"> <button androID:ID="@+ID/btn_change_content" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:text="@string/changeContent" /> <TextVIEw androID:ID="@+ID/fragment_tv" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:gravity="center" androID:text="@string/fragmentA" androID:textcolor="@color/black" androID:textSize="20sp" /></linearLayout>
ContainerActivity 文件实现 AFragment 中接口进行通信.
package com.example.hello.fragment;import androIDx.appcompat.app.AppCompatActivity;import androIDx.fragment.app.Fragment;import androID.os.Bundle;import androID.Widget.button;import com.example.hello.R;public class ContainerActivity extends AppCompatActivity implements AFragment.ChangeContent { private AFragment aFragment; private BFragment bFragment; private button btnChange; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_container); btnChange = findVIEwByID(R.ID.btn_change_fragment); btnChange.setonClickListener(v -> { // 切换 if (bFragment == null) { bFragment = new BFragment(); } // 防止实例 Fragment fragment = getSupportFragmentManager().findFragmentByTag("a"); if (fragment != null) { getSupportFragmentManager().beginTransaction().hIDe(fragment).add(R.ID.content_fragment, bFragment).addToBackStack(null).commitAllowingStateLoss(); } else { getSupportFragmentManager().beginTransaction().replace(R.ID.content_fragment, bFragment).addToBackStack(null).commitAllowingStateLoss(); } }); // 实例化 aFragment = new AFragment("参数"); // 将 aFragment 放入到 Activity 中 getSupportFragmentManager().beginTransaction().add(R.ID.content_fragment, aFragment, "a").commitAllowingStateLoss(); } /** * 改变内容 * * @param Title 内容 */ @OverrIDe public voID setContent(String Title) { btnChange.setText(Title); }}
总结 以上是内存溢出为你收集整理的Android 中 Fragment 的基本使用全部内容,希望文章能够帮你解决Android 中 Fragment 的基本使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)