Andriod开发 fragment

这篇具有很好参考价值的文章主要介绍了Andriod开发 fragment。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.fragment

fragment是一个可以嵌入到Activity中的可重用UI组件。它可以让你在一个Activity中展示多个界面,并且可以在运行时动态地添加、移除、替换和组合不同的fragment,从而实现复杂的UI交互效果。

与Activity类似,Fragment也有自己的生命周期,包括onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等方法。同时,Fragment也可以接收来自Activity的回调事件,并且可以通过FragmentManager来管理Fragment的生命周期和交互。

生命周期

Andriod开发 fragment

 

2.fragment静态注册

静态注册指的就是直接在Activity的布局中加入一个fragment

<?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"
    tools:context=".FragmentStaticActivity"
    android:orientation="vertical"
    >
    
    <fragment
        android:id="@+id/fg"
        android:name="com.example.chapter08.fragment.StaticFragment"
        android:layout_width="match_parent"
        android:layout_height="100dp"></fragment>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textColor="@color/teal_200"
        android:layout_marginTop="30dp"
        android:textSize="30dp"></TextView>

</LinearLayout>

fragment里有一个属性name,指向了对应的fragment子类:

这个子类可以实现fragment的逻辑交互操作,就像Activity的class一样

package com.example.chapter08.fragment;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.chapter08.R;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link StaticFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class StaticFragment extends Fragment {
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_static, container, false);
    }
}

这个子类中的onCreateView方法,指明了这个fragment对应的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".fragment.StaticFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:text="Hello 0616!"
        android:textColor="@color/purple_500"/>

    <ImageView
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent"
        android:src="@drawable/l1"
        android:scaleType="fitXY"
        ></ImageView>

</LinearLayout>

整体逻辑就是:

Activity class->Activity xml (包含 fragment)->fragment class -> fragment xml

3.fragment动态注册

前面说的静态注册,就是直接在需要fragment的页面的xml里直接加上一个fragment,然后用属性name写清楚fragment指向的类。

动态注册指的是程序运行后,再在页面中加入fragment。

我们可以直接在Andriod Studio 里new一个blank的fragment

Andriod开发 fragment

 然后我们可以看到fragment.java里自动生成了

public static DynamicFragment newInstance()

这个方法可以用于创建 fragment,然后将fragment所需的参数打包到Bundle中,然后作为fragment的参数存储。

接着在

public View onCreateView()

我们可以设置这个fragment对应的布局(xml),然后使用刚才保存的Bundle读取参数,设置布局中的View

具体如下:

package com.example.chapter08.fragment;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.chapter08.R;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link DynamicFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class DynamicFragment extends Fragment {


    public static DynamicFragment newInstance(int position, int image_id, String desc) {
        DynamicFragment fragment = new DynamicFragment();
        Bundle args = new Bundle();
        args.putInt("position", position);
        args.putInt("image_id", image_id);
        args.putString("desc", desc);
        fragment.setArguments(args);
        return fragment;
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       View view = inflater.inflate(R.layout.fragment_dynamic, container, false);
        Bundle bundle = getArguments();
        if(bundle!=null){
            ImageView iv = view.findViewById(R.id.iv);
            TextView tv = view.findViewById(R.id.tv);
            iv.setImageResource(bundle.getInt("image_id"));
            tv.setText(bundle.getString("desc"));
        }
        return view;
    }
}

创建这个fragment:

DynamicFragment.newInstance(position,book.image,book.name);

我们可以用fragment来实现引导页,需要使用的Adapter为 FragmentPagerAdapter的子类:

package com.example.chapter08;

import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

import com.example.chapter08.entity.Book;
import com.example.chapter08.fragment.DynamicFragment;

import java.util.List;

public class MobileFragmentPagerAdapter extends FragmentPagerAdapter {
    private List<Book> list;
    public MobileFragmentPagerAdapter(@NonNull FragmentManager fm, List<Book> list) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        this.list = list;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        Book book = list.get(position);
        return DynamicFragment.newInstance(position,book.image,book.name);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return list.get(position).name;
    }
}

 主Activity:文章来源地址https://www.toymoban.com/news/detail-487669.html

package com.example.chapter08;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.PagerTabStrip;
import androidx.viewpager.widget.ViewPager;

import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;

import com.example.chapter08.entity.Book;

import java.util.List;

public class FragmentDynamicActivity extends AppCompatActivity {

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


        //init pager tab
        PagerTabStrip pt =  findViewById(R.id.pt);
        pt.setTextSize(TypedValue.COMPLEX_UNIT_SP,20);
        pt.setTextColor(Color.GRAY);

        //init view page
        ViewPager vp = findViewById(R.id.vp);
        List<Book> list = Book.getDefaultList();
        MobileFragmentPagerAdapter adapter = new MobileFragmentPagerAdapter(getSupportFragmentManager(), list);
        vp.setAdapter(adapter);

        vp.setCurrentItem(2);


    }
}

到了这里,关于Andriod开发 fragment的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WPF开发一个可以自适应排列的Panel控件

    一.控件介绍     初看标题可能无法理解,我们看看什么是自适应排列。 乍一看它有点像WrapPanel控件,都是从左至右排列,如果一行排列不下就换行继续排列,但是细看你就会发现不对,WrapPanel控件行尾是不会对齐的,也就是说只要WrapPanel的子控件的宽度不一致,每一行的

    2024年04月08日
    浏览(50)
  • Android 下第一个fragment app 先Java 后Kotlin

    看着视频学习的,Fragment:3.Fragment使用方法_哔哩哔哩_bilibili 程序的运行效果是,手机页面有2个fragment,每个fragment 有一个text view,一个按钮,按一下显示,\\\'fine,and you?\\\',各自独立。 在android studio 下新建一个工程,类型是 Empty View Activity,本身就有一个Activity。就有文件Main

    2024年02月09日
    浏览(37)
  • 从一个Activity跳转到另一个Activity的指定Fragment,附底部菜单栏的实现

    这部分参考B站视频Springboot: 2022最新版】Android Studio 安装 Android(安卓)开发零基础入门到精通全套教程P118-119 效果图: 忘了需不需要添加依赖了,大概率是本来就有不用添加,但还是把可能有关的依赖先贴上来 先在res下的menu包里(没有就建一个menu包)新建一个 buttom_nav_m

    2024年02月03日
    浏览(37)
  • 【Android】怎么使用一个ViewModel用在多个Activity或者Fragment中

    项目需求 在多个Activity或者Fragment中使用同一个ViewModel 需求实现 1.使用ActivityScope或FragmentScope 想在一个Activity或Fragment中共享ViewModel实例,可以使用ActivityScope或FragmentScope。这两种范围会根据它们所绑定的Activity或Fragment自动管理ViewModel实例的生命周期。 例如,创建一个继承自

    2024年02月15日
    浏览(41)
  • 通过开发一个桶装水上门送水订水小程序,可以解决哪些问题?

    提高订水效率:用户可以直接在小程序上完成订水流程,无需拨打水站电话或前往水站,节省了用户的时间和精力。 方便管理用户信息:水站可以建立用户管理系统,对用户的订单信息、送水地址等进行管理,方便后续的送水和售后服务。 营销获客:通过在线发放优惠券、

    2024年01月19日
    浏览(40)
  • 数据驱动开发模式将软件开发过程改造成一个公式化的迭代模式,可以提升软件开发效率,缩短开发周期,降低开发成本。

    作者:禅与计算机程序设计艺术 随着云计算、大数据等新兴技术的应用,软件开发领域迎来了蓬勃发展的时期。各种编程语言、框架、工具不断涌现,协同工作的强烈需求已经成为当今社会的一个主要挑战。这就需要一种新的开发方式来适应这种复杂多变的环境。传统的瀑布

    2024年02月06日
    浏览(79)
  • vue3中Fragment特性的一个bug,需要留意的注意事项

    vue3中的Fragment 模版碎片特性是什么,简单的理解就是 template模板代码 不在像vue2中那样必须在根节点在包裹一层节点了。 vue2写法 vue3写法 vue3中Fragment特性的一个bug(需要留意的问题) 组件HelloWorld: 组件HelloWorld的使用 同时控制台waring : 利用开发者模式看dom结构, 发现v-show的

    2024年01月22日
    浏览(44)
  • 开发了一个Java库的Google Bard API,可以自动化与AI对话了

    Google Bard 是Google提供的还在实验阶段的人工智能对话服务。这明显是对标 ChatGPT 来的,它可以提供更实时的答案,会基于Google强大的网页数据。 为了更方便的使用并实现自动化,我写了一个Java类库,GitHub仓库地址为:https://github.com/LarryDpk/Google-Bard 欢迎大家STAR... 使用是非常

    2024年01月22日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包