从fragment跳转到activity_Lottie动画:Fragment的结构

a4d8d3c843b7460ff581bf69209bc646.png前情提要7e3d7a0f8ac2617e7c9a94d14ff5d9ad.png 

主页面的跳转函数

45fb63c1a333fd69daed9a2cd47d9bc6.png

a4d8d3c843b7460ff581bf69209bc646.pngFragment7e3d7a0f8ac2617e7c9a94d14ff5d9ad.png 

ShowcaseFragment 继承 BaseEpoxyFragment,

BaseEpoxyFragment 继承 BaseMvRxFragment

BaseMvRxFragment 

com.airbnb.android:mvrx:1.3.0 第三方库中的,链接:

在看另外两个Fragment

(PreviewFragment和LottiefilesFragment)

都是BaseMvRxFragment的子类,自然就需要了解一下mvrx这个库了

a4d8d3c843b7460ff581bf69209bc646.pngMvRx库7e3d7a0f8ac2617e7c9a94d14ff5d9ad.png

全称:ModelView ReactiveX,

是Airbnb开源的一个库,运用了Kotlin、Android Architecture Components、RxJava、React和Epoxy技术,利用这个库可以方便地构建出MVVM架构的APP。

d5d0a58733488d3f0a1635516985356f.png核心概念

MvRx 有四个核心的概念,分别是 State、ViewModel、View 和 Async。

d5d0a58733488d3f0a1635516985356f.pngState

MvRxState用来储存页面所需要的数据,是不可变对象(immutable object),单纯存储数据;State的改变会触发View的invalidate()方法,从而通知界面重绘。

11c34235a5063c7d850101375513d1b2.png

d5d0a58733488d3f0a1635516985356f.pngViewModel

  • 是Architecture Components中ViewModel的扩展;

  • 用来处理所有的业务逻辑,ViewModel搭配一个State,可以在ViewModel中更新、读取State,然后View可以观察State的状态,根据状态进行更新

  • 实现类继承MvRxViewModel

c83edeece440e700993ec4ddab4df45a.png

PS:需要有一个工厂方法,主要用途是通过依赖注入传入一些参数来构造ViewModel

d5d0a58733488d3f0a1635516985356f.pngView

一般而言是一个继承自BaseMvRxFragment的Fragment,需要实现invalidate()方法,每当ViewModel的state发生改变时invalidate()方法都会被调用

c48a061eb38ff782edd5948770cecfb0.png

d5d0a58733488d3f0a1635516985356f.pngAsync

  • 专门处理异步请求(加载状态)的类

  • 是一个Kotlin sealed class,它有四种类型:Uninitialized, Loading, Success, Fail(包含了一个名为 error 的属性,可以获取错误类型)

d5d0a58733488d3f0a1635516985356f.png更新state的两种方法

  • execute

6adeb1180639e441df5055bc538dc23e.png  
  • setState

bb59e9f7cbfdf5f71ac1ca885a318a82.png

d5d0a58733488d3f0a1635516985356f.pngView中使用ViewModel

MvRx提供3了个获取ViewModel的扩展方法:

  • fragmentViewModel 创建或者获取现有的ViewModel,有效范围为Fragment

  • activityViewModel 创建或者获取现有的ViewModel,有效范围为Activity,通常用于Fragment间数据共享

  • existingViewModel 获取现有的ViewModel,若没有则会出错

ViewModel中使用State

withState(viewModel) {}

3082df3508b7bb49f3f18281b6a38758.png

d5d0a58733488d3f0a1635516985356f.png奇怪的语法

f32c7f89fba1b9fc6b821e3cdf2540dd.png  

点击一下方法,可以发现是EpoxyController的扩展方法,同时也发现这个内联函数是插件生成的。同时EpoxyController是第三方库

com.airbnb.android:epoxy:3.9.0,github地址:

https://github.com/airbnb/epoxy

a4d8d3c843b7460ff581bf69209bc646.pngEpoxy7e3d7a0f8ac2617e7c9a94d14ff5d9ad.png

简化RecycleView使用,尤其是在有多种ViewType的时候。Epoxy的主要作用有两个,第一,简化RecyclerView多ViewType的开发;第二,如果数据变化,会自动进行更新

d5d0a58733488d3f0a1635516985356f.png两个重要组件

EpoxyModel:描述了某个view如何在RecyclerView中显示

EpoxyController:确定哪些item显示在RecyclerView中

d5d0a58733488d3f0a1635516985356f.pngEpoxyModel

8b1afe4c4d1652727ba8d839691e4462.png  
  • @ModelView注解该class,告诉Epoxy这是一个EpoxyModel

  • @ModelProp注解一个方法,为该EpoxyModel增加一个属性

  • @TextProp 标示这个属性是字符串

  • 还有其他属性可以在实际使用中查找

d5d0a58733488d3f0a1635516985356f.pngEpoxyController

3bfc9a6e1f6fcee9734c079d9ff0047c.png  

buildModels中添加RecycleView中的item,这个回调就是最开我们看到的奇怪地方;其中RecycleView中的item列表就是:marquee、showcaseCarousel、loadingView

和animationItemView

b9b349f9e056e3e054aa74ba6b363112.png

到这里主页面的结构就都梳理清楚了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 从Fragment跳转Activity可以通过以下步骤实现: 1. 在Fragment中获取Activity的引用: ``` Activity activity = getActivity(); ``` 2. 创建Intent对象并设置要跳转Activity: ``` Intent intent = new Intent(activity, TargetActivity.class); ``` 3. 调用startActivity方法启动目标Activity: ``` startActivity(intent); ``` 完整代码示例: ``` public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); Button btnJump = view.findViewById(R.id.btn_jump); btnJump.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取Activity的引用 Activity activity = getActivity(); if (activity != null) { // 创建Intent对象并设置要跳转Activity Intent intent = new Intent(activity, TargetActivity.class); // 启动目标Activity startActivity(intent); } } }); return view; } } ``` ### 回答2: 在实际开发中,我们经常需要在Fragment中进行跳转,如点击Fragment中的按钮会跳转到某个Activity页面。以下是实现从Fragment跳转Activity的一种方法。 1. 创建Activity 首先,我们需要创建一个新的Activity。可以在Android Studio中使用“New -> Activity -> Empty Activity”来创建一个空的Activity。在Activity的布局文件中可以放置需要展示的控件,如TextView、ImageView等。 2. 在Fragment中注册点击事件 在Fragment中找到需要点击进行跳转的View(如Button),并注册点击事件。在点击事件中使用Intent来跳转Activity。代码示例如下: ```java Button btnToActivity = view.findViewById(R.id.btn_to_activity); btnToActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getActivity(), YourActivityName.class); startActivity(intent); } }); ``` 在Intent的构造函数中,第一个参数为当前Fragment所属的Activity对象,第二个参数为需要跳转Activity.class。可以通过修改YourActivityName来指定需要跳转Activity。 3. 在AndroidManifest.xml中注册Activity 当我们创建一个新的Activity时,需要在AndroidManifest.xml中进行注册才能在其他组件中使用。打开AndroidManifest.xml文件,找到“application”标签内,创建一个新的“activity”标签,添加我们新创建的Activity信息。代码示例如下: ```xml <activity android:name=".YourActivityName"/> ``` 其中,YourActivityName为你新创建的Activity名称。 4. 运行应用 完成以上三个步骤后,我们可以运行应用并点击Button进行跳转。如果出现问题,可以检查是否在AndroidManifest.xml中正确注册了Activity,或者是否在代码中正确引用了Activity名称。 总结 以上就是实现从Fragment跳转Activity的简单步骤。在实际开发中,我们可能需要传递一些数据到目标Activity,可以在Intent中使用putExtra()方法来实现。例如: ```java Intent intent = new Intent(getActivity(), YourActivityName.class); intent.putExtra("key", value); startActivity(intent); ``` 在目标Activity中可以接收传递的数据,例如: ```java getIntent().getStringExtra("key"); ``` 希望以上内容对你有所帮助。 ### 回答3: 在Android应用程序中,FragmentActivity是很重要的两个概念。Fragment可以看作是Activity的一部分,它可以在Activity中添加和移除,并且可以重用。而Activity是一个单独的UI界面,与用户交互,完成特定的任务。 在某些情况下,我们需要从Fragment跳转到另一个Activity页面,这个过程可以通过以下几步完成: 1. 首先,在Fragment中的适当位置,添加一个Intent对象,用于启动目标Activity。 ``` Intent intent = new Intent(getActivity(), TargetActivity.class); startActivity(intent); ``` 这将创建一个新的Intent对象,并通过调用Activity的startActivity()方法来启动目标Activity。 2. 接下来,在目标Activity的布局文件中创建一个新的布局,以便在其中包含所需的UI元素。然后,在Activity中执行所需的操作。例如,如果您需要从Fragment中提取一些数据,并在另一个Activity中显示它们,您可以使用getIntent()方法来获取传递的Intent对象,并从中提取数据。 ``` Bundle extras = getIntent().getExtras(); if (extras != null) { String value = extras.getString("key"); // do something with your value } ``` 这段代码将从传递的Intent对象中获取值,并将其存储在一个字符串变量中,您可以在其中执行任何操作。 3. 最后,在新的Activity中完成任务后,您可以使用finish()方法关闭该Activity,并返回到父ActivityFragment。在某些情况下,您可能需要返回一些数据给父ActivityFragment,例如,用户在目标Activity中进行了一些更改,并且需要在父ActivityFragment中进行相应的更改。 ``` Intent intent = new Intent(); intent.putExtra("key", "value"); setResult(RESULT_OK, intent); finish(); ``` 这段代码将在关闭Activity之前,将需要返回的数据存储在Intent对象中,并使用当前Activity的setResult()方法将其设置为RESULT_OK的值。这将告诉父ActivityFragment,在目标Activity已完成任务时可以返回结果,并且您可以在之后的代码中使用返回的数据执行操作。 通过这些步骤,您可以在Android应用程序中从Fragment跳转到其他Activity。这使得您可以为应用程序创建复杂的UI,以便在不同的屏幕大小和方向上提供最佳的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值