本篇主要介绍一下 ViewPager2 + Fragment , 上篇中简单使用了ViewPager2 实现了一个图片的滑动效果, 那图片视图可以滑动, ViewPager2也可以滑动 Fragment

ViewPager2 官方对它的描述就是 以可滑动的格式显示视图或 Fragment 也就说明提供了滑动Fragment的实现 并且还很简单, 下面来看看吧
编写Adapter 实现 FragmentStateAdapter下面用实际代码 来展示 滑动Fragment
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".ViewPage2FragmentActivity">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager2fragment"
android:layout_width="match_parent"
android:layout_height="300dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@color/pink"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

package com.johnny.slzzing;
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;
/**
* A simple {@link Fragment} subclass.
* Use the {@link ViewPage2Fragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class ViewPage2Fragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public ViewPage2Fragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment ViewPage2Fragment.
*/
// TODO: Rename and change types and number of parameters
public static ViewPage2Fragment newInstance(String param1, String param2) {
ViewPage2Fragment fragment = new ViewPage2Fragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_view_page2, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
TextView textView = view.findViewById(R.id.fragmenttextview);
textView.setText(mParam1);
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".ViewPage2Fragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:id="@+id/fragmenttextview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment"
android:gravity="center"
android:textSize="25sp"
android:textColor="@color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
fragment 很简单 就在中间有个TextView 区分不同的fragment

package com.johnny.slzzing;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import java.util.Arrays;
import java.util.List;
public class ViewPage2FragmentActivity extends AppCompatActivity {
ViewPager2 viewPage2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_page2_fragment);
viewPage2 = findViewById(R.id.viewpager2fragment);
ViewPager2FragmentAdapter viewPager2FragmentAdapter = new ViewPager2FragmentAdapter(this , initFragmentList());
//重点 ! 把 viewPage2设置adapter 这个adapter 不是去直接继承RecycleView.Adapter了
viewPage2.setAdapter(viewPager2FragmentAdapter);
}
//初始化3个fragment
private List<Fragment> initFragmentList() {
ViewPage2Fragment viewPage2Fragment = ViewPage2Fragment.newInstance("我是Fragment1", "");
ViewPage2Fragment viewPage2Fragment2 = ViewPage2Fragment.newInstance("我是Fragment2", "");
ViewPage2Fragment viewPage2Fragment3 = ViewPage2Fragment.newInstance("我是Fragment3", "");
return Arrays.asList(viewPage2Fragment,viewPage2Fragment2,viewPage2Fragment3);
}
// 提供了FragmentStateAdapter 只需要继承它即可 不用继承RecycleView.Adapter
static class ViewPager2FragmentAdapter extends FragmentStateAdapter{
private final List<Fragment> fragmentList;
public ViewPager2FragmentAdapter(@NonNull FragmentActivity fragmentActivity, List<Fragment> fragmentList) {
super(fragmentActivity);
this.fragmentList = fragmentList;
}
@NonNull
@Override
public Fragment createFragment(int position) {
return fragmentList.get(position);
}
@Override
public int getItemCount() {
return fragmentList.size();
}
}
}
粉色区域是可以滑动切换 不同的Fragment 的

本篇主要介绍了 ViewPager2 结合 Fragment 的基本使用方式 , 让我们可以快速的实现滑动Fragment 的功能. 后续还可以结合 BottomNavigationView 联动 底部导航栏+滑动, 有机会再说把
欢迎大家访问 个人博客 Johnny小屋
欢迎关注个人公众号

先给大家看看最终效果首先我们来定义数据data(){ return{ lsit:[ 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic118.nipic.com%2Ffile%2F20161216%2F24271963_122609717000_2.jpg&refer=http%3A%2F%2Fpic118.nipic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1656923017&t=183ece148b13b64e9dd503afd1b15c91'
我一直在尝试使用Rails的缓存功能,但我无法使某些缓存片段过期,尽管它们似乎已过期。使用Rails教程站点中指出的“俄罗斯娃娃缓存”,我正在使用此配置我在release_controller.rbController中使外部缓存过期,我在其中使用expire_fragment("all_available_releases")使片段过期。我在更新、删除或添加条目的Controller的每个方法中都使用它。这是WEBrick的日志,尽管过期片段已在其中注册,但5行后过期片段被读取并使用,而这是不应该的。这个例子是在destroy调用之后。ProcessingbyReleasesCont
我几乎什么都试过了,但似乎无法使用来自模型的expire_fragment?我知道你不应该这样做非MVC,但肯定有很多方法可以做到。我在lib/cache_helper.rb中用我所有的过期助手创建了一个模块,在每个中只是一堆expire_fragment调用。我有我所有的/app/sweepers下的缓存清扫器设置,并有一个“includeCacheHelper”在我的应用程序Controller中,因此在通过Controller调用时应用程序工作正常。然后事情是我有一些外部守护进程,尤其是一些循环的cron任务调用一个调用特定任务的rake任务方法。此方法进行一些处理并将条目输入到
我正在使用three.js运行资源匮乏的片段着色器。我已将渲染大小设置为800*600,以保持着色器即使在低端卡上也能流畅运行。我正在这样设置我的渲染Canvas:varcanvas1=document.getElementById('canvas1');renderer=newTHREE.WebGLRenderer(canvas1);renderer.setSize(800,600);renderer.autoClear=false;document.body.appendChild(renderer.domElement);在body元素上我有然后我在cssheader中做widt
当我点击fragment中的线性布局时,它不会给出任何错误,但不会开始新的Activity。我的代码有什么错误吗?请有人帮助我。我的项目的这个fragmentxml文件代码。Fragment_one.xml我的项目的这段java类代码。FragmentOne.javainfo.androidhive.listviewfeed;importandroid.app.Fragment;importandroid.content.Intent;importandroid.os.Build;importandroid.os.Bundle;importandroid.view.LayoutInfl
我在tv.setMovementMethod(newScrollingMovementMethod());上遇到了NullPointerException但我完全不知道为什么!我已经在XML文件中声明了textView并在onCreateView中对其进行了初始化。任何帮助,将不胜感激。这里是java代码的相关部分:publicclassTestConnectionextendsFragment{publicTestConnection(){}JSONParserjParser=newJSONParser();//buttonpressedtogettheitemsButtongetA
我使用GoogleMapsAndroidv1API创建了我的应用程序的第一个版本。但是现在当我发布第二个版本的应用程序时,谷歌地图停止工作。我认为这是因为它已被弃用。所以现在我正在尝试创建示例Android应用程序以使用链接使用Googlemaphttps://developers.google.com/maps/documentation/android/start#getting_the_google_maps_android_api_v2但是我遇到了强制关闭错误FATALEXCEPTION:mainjava.lang.RuntimeException:Unabletostarta
我正在尝试开发一个时间线,就像下面的facebook一样。你看,我有一个ViewPager可以在“fragment”(如提要、个人资料、关于等)之间导航用户。我有“main.xml”,它上面只有viewpager;我还有fragmenta.xml、fragmentb.xml、fragmentc.xml。让我们检查一下fragmenta.xml,我把它放在里面;并制作了singlerow.xml来将这些框创建成这样的时间线;我让它只使用一个静态框。但是当我尝试运行这个结构时,我在Debug模式下遇到错误“找不到来源编辑源查找路径”在我尝试像这样将我的适配器和其他关于listview的东西
所以我尝试在我的应用程序中创建一个fragment,其中包含使用appcompatActivity的工具栏(作为操作栏),以便我可以在多个View中重复使用它。我已经使用仅扩展fragment的类测试了一个简单的纯文本fragment并使其正常工作,但要包含一个工具栏,我需要在View中扩展AppCompatActivity(我认为).当我尝试让它工作时,我收到一条错误消息,指出我的action_bar_fragment不是Fragment。我觉得我在这里缺少一些基本的东西。有什么想法吗?主要Activity:packagecom.example.aaron.personaldataa
我试图让我的fragment出现在我的手机上,但由于某种原因它不会这样做。然而,当在平板电脑上加载相同的东西时,它看起来很正常。有人知道我的代码有什么问题以及如何解决这个问题吗?所有相关帮助将不胜感激。类(class)链接FragmentWCLine.javaWCBankActivity.javaFragmentWCBank.javaWCBankViewPagerAdapter.java布局链接fragment_wc_line.xmlfragment_wc_bank.xml 最佳答案 在FragmentWCBank中,您应该使用子f