更改 viewpager 中当前片段的背景图像

2024-04-01

我在 viewpager 中有 4 个片段。 FragmentStatePagerAdapter 在我的 viewpager 所在的活动中。 FragmentStatePagerAdapter 的 newInstance() 方法将布局 id 作为参数,因此每个片段都有自己的布局:

ViewPager pager;

public class MainActivity extends FragmentActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     
        pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));}

    private static class MyPagerAdapter extends FragmentStatePagerAdapter {
       FragmentManager fm;
       SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
            this.fm = fm;
        }

        @Override
        public Fragment getItem(int pos) {
        if(pos!=0){
            pos = pos%4;
        }
            Fragment frag;
            switch(pos) {
            case 0: frag = FirstFragment.newInstance(R.layout.fire_room_wall1);
                    return frag;
            case 1: frag = FirstFragment.newInstance(R.layout.fire_room_wall2);
                    return frag;
            case 2: frag = FirstFragment.newInstance(R.layout.fire_room_wall3);
                    return frag;
            case 3: frag = FirstFragment.newInstance(R.layout.fire_room_wall3);
                    return frag;
            default: return FirstFragment.newInstance(R.layout.fire_room_wall1);
            }
        }

        @Override
        public int getCount() {
            return 444444;
        }     

             @Override
                public Object instantiateItem(ViewGroup container, int position) {
                    Fragment fragment = (Fragment) super.instantiateItem(container, position);
                    registeredFragments.put(position, fragment);
                    return fragment;
                }

                @Override
                public void destroyItem(ViewGroup container, int position, Object object) {
                    registeredFragments.remove(position);
                    super.destroyItem(container, position, object);
                }

                public Fragment getRegisteredFragment(int position) {
                    return registeredFragments.get(position);
                }
    }
}

这是第一个片段:

public class FirstFragment extends Fragment{

     @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            int layout = getArguments().getInt("layout");
            View v = inflater.inflate(layout, container, false);    
            return v;
        }

        public static FirstFragment newInstance(int layout) {

            FirstFragment f = new FirstFragment();
            Bundle b = new Bundle();
            b.putInt("layout", layout);
            f.setArguments(b);
            return f;
        }
}

和activity_main.xml:

    <RelativeLayout 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=".MainActivity" >
<FrameLayout android:layout_width="match_parent"
    android:layout_height="match_parent">
<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewPager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
<com.example.viewpagerfragement.CustomView android:id="@+id/customView"
        android:layout_width="fill_parent" android:layout_height="fill_parent" />
</FrameLayout>
</RelativeLayout>

以及 newInstance 参数之一 fire_room_wall1.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
     android:background="@drawable/wall_nobrainjar"
     android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/first" >

//其他一些子视图

     <ImageView
        android:id="@+id/zoomed_image"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:visibility="gone"/>

//其他一些子视图

</RelativeLayout>

现在,在我的程序中的某个时刻,我想更改当前片段布局的背景图像。我尝试这样做:

  int i = pager.getCurrentItem();
    Fragment page = ((MyPagerAdapter)pager.getAdapter()).getRegisteredFragment(i);
    ((BitmapDrawable)page.getView().getBackground()).getBitmap().recycle();
    page.getView().setBackgroundResource(R.drawable.wall3_nopaperball);

但这条线“((BitmapDrawable)page.getView().getBackground()).getBitmap().recycle();" 返回 NullPointerException 因为page.getView().getBackground()一片空白。我做错了什么或者如何更改背景图像? 附:由于某种原因 page.getView() 的类型是 NoSaveStateFrameLayout,而不是人们所期望的relativelayout


解决方案: -

实际上你的问题是你正在回收位图,即你正在释放该位图和像素数据,所以,显然你会得到 null 。!

It is already mentioned in android api documents:-- enter image description here

你只需要这样做:--

int i = pager.getCurrentItem();
Fragment page = ((MyPagerAdapter)pager.getAdapter()).getRegisteredFragment(i);
Bitmap bitmapNeedTobeRecycled = ((BitmapDrawable)page.getView().getBackground()).getBitmap()
page.getView().setBackgroundResource(R.drawable.wall3_nopaperball);
bitmapNeedTobeRecycled.recycle();

然后就可以了..享受吧..!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改 viewpager 中当前片段的背景图像 的相关文章

  • 使用新语法应用 Android Gradle 插件

    如何使用新的 Gradle 插件语法应用 Android 插件 plugins id version 代替 buildscript dependencies classpath com android tools build gradle
  • ContentResolver的notifyChange方法是否也通知详细的Uri?

    在应用数据期间我使用notifyChange与Uri 假设我通知content com package my items 我还有详细的Activity显示数据来自content com package my items 1 是否通知 一般
  • 我在哪里可以获得可靠的熵来源(真正的随机性字节[])?

    目前 我正在寻找一种方法来增加随机性的质量 in my Android应用程序 纸牌游戏 之前 估计对于我的情况 52 排列 至少需要 226 位熵 226 个随机位 我打算用这个byte 作为种子SecureRandom SecureRa
  • Android上如何模拟后台Activity因内存不足而被系统杀死的过程?

    我正在处理 内存不足 不再有后台进程 问题 当这种情况发生时 我的活动处于后台并被杀死 我正在尝试保存并加载实例状态来解决它 但因为它并不是每次都会发生 在这种情况下我应该如何测试我的活动 Thanks 您可以通过 adb 强制进程终止 g
  • 使用 dpi 与 dp 缩放图像之间的差异

    我拥有所有由九个补丁位图组成的 dpi 可绘制目录 xxhdpi 和 xxxhdpi 是否必要 可绘制目录中的可绘制资源文件可检索所有缩放的位图 并且我使用可绘制资源文件 现在 我的问题是我还根据大小 小 正常等 创建了 缩放 布局目录 其
  • 从历史堆栈中删除活动

    我的应用程序在用户第一次运行应用程序时显示注册活动 如下所示 活动启动画面 欢迎来到游戏 注册帐户 ActivitySplashScreenSignUp 很好 填写此信息 ActivityGameMain 游戏主屏幕 因此 当用户单击每个屏
  • 使用 HttpClient 时,为什么服务器响应中省略了 Content-Length 标头?

    我正在使用这个问题的源代码如何异步执行httprequest并显示下载响应的进度 https stackoverflow com questions 9594318 how to asynchronous perform a httpreq
  • 需要使用手机后退按钮返回 Web 视图的帮助

    这是我的代码 package com testappmobile import android app Activity import android os Bundle import android view KeyEvent impor
  • API29 上不推荐使用 setColorFilter

    我使用以下行来更改 VectorDrawable 的颜色 mydrawable getBackground setColorFilter color PorterDuff Mode SRC ATOP 这很好用 尽管它现在已被弃用 文档建议我
  • Android:如何使用后台线程?

    我开发了一个应用程序 它从互联网获取内容并相应地在设备的屏幕上显示它 该程序运行得很好 就是有点慢 加载并显示内容大约需要 3 4 秒 我想将获取内容并将其显示在后台线程中的所有代码放在一起 当程序执行这些功能时 我想显示一个进度对话框 你
  • Android Fragment onCreateView 与手势

    我正在尝试在片段中使用手势 我在 FragmentActivity 中有以下内容来处理我的详细信息片段 我试图发生的情况是 当在视图上检测到滑动时 将该视图内的数据替换为上一个或下一个条目 如果有更好的方法来处理这个问题 我完全同意 然而
  • 如何制作在手机和平​​板电脑上使用的响应式Android应用程序?

    我创建了一个 Android 应用程序 当我运行我的应用程序时Mobile Phone它工作得很好 但是当我跑进去时Tablet应用程序的布局已更改 那么 如何制作响应式Android应用程序用于Mobile并且也在Tablet 在Andr
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • TextInputLayout 对于在 EditText 中以编程方式给出提示没有效果

    我有一个 EditText 它的父级是 TextInputLayout 我试图以编程方式为 EditText 提供提示 不在布局中 在这种情况下 文本输入提示动画不起作用 它像简单的 EditText 一样工作 有人可以建议如何处理它吗 下
  • 屏幕开/关检测

    在这里 我试图确定屏幕是否打开 但按下电源锁定 解锁按钮时它似乎不起作用 应用程序运行没有错误 但 if else 中的代码似乎没有效果 Edited现在代码可以工作了 谢谢Olgun 但媒体播放器播放不会停止 并且每次在屏幕上 离屏时都会
  • Glass 语音命令给定列表中最接近的匹配项

    使用 Glass 您可以通过 确定 Glass 菜单启动应用程序 它似乎会选择最接近的匹配项 除非命令相距数英里 并且您可以明显看到命令列表 无论如何 是否可以从应用程序内或从语音提示 在初始应用程序触发后 给出类似的列表并返回最接近的匹配
  • Android Root 执行 su 带参数

    我在使用参数执行 su 时遇到问题 包含空格 我的 Command java 看起来像这样 public class Command Process process public String executeCommand String c
  • 剪切评级栏中的图像

    我制作了自己的评级栏 花朵图像有 4 种尺寸 xdpi hdpi 等 从 24px24px 到 64x64px
  • 使用 DataBindingComponent 的 Inflate 方法

    当 Glide 成功渲染图像后 我在更新文本视图时看到此错误 致命异常 java lang IllegalStateException 必需 CustomBinding 类中的 DataBindingComponent 为 null 绑定适
  • Fragment 生命周期和在不存在的 Fragment 上调用 onCreate 的问题

    我正在 Android 中测试片段 并且片段生命周期有一些令人困惑的行为 我有一个活动 在横向和纵向模式下使用 xml 布局 我有一些代码可以访问在片段布局之一中定义的 EditText 对象 如果我以横向模式启动应用程序 一切都会正常 我

随机推荐

  • ActiveSupport::JSON.decode 无法正确处理文字换行符

    这是预期的行为吗 请注意换行符是如何丢失的 ruby 1 9 2 p136 001 gt ActiveSupport JSON decode content active n nsupport gt content gt active ns
  • R markdown:我可以将 pdf 作为图像插入到 r markdown 文件中吗?

    我正在尝试将 pdf 图像插入到 r markdown 文件中 我知道可以插入 jpg 或 png 图像 我只是想知道是否也可以插入 pdf 图像 非常感谢 如果您只是尝试插入从某些 R 分析导出的图像到 pdf 图像中 您还可以使用 kn
  • Sublime Text 缩进问题

    我在组合 html 和 jsp 标记时遇到缩进问题 重现步骤 文件 gt 新建文件 Ctrl N 视图 gt 语法 gt Java gt Java 服务器页面 JSP 粘贴以下代码 ul ul
  • AVRDUDE Android Arduino ioctl 错误

    我之前的问题 Android 无法使用 AVRDUDE 与 Arduino 通信 https stackoverflow com questions 15596376 android cannot talk to arduino using
  • 为什么说内核位于进程地址空间中?

    这可能是一个愚蠢的问题 但它突然出现在我的脑海中 所有有关进程地址空间和虚拟内存布局的文本都提到进程地址空间 为内核保留的空间 例如在 32 位系统上 进程地址空间为 4GB 其中 1GB 为 Linux 中的内核保留 在其他操作系统上可能
  • SCRAM 身份验证需要 [重复] 中的 libpq 版本 10 或更高版本

    这个问题在这里已经有答案了 当我尝试使用 PHP 连接到 Postgresql 服务器时 出现错误 如下所示 无法连接到 PostgreSQL 服务器 SCRAM 身份验证需要 libpq 版本 10 或更高版本 我使用 Enterpris
  • Python IDLE 在历史中搜索(类似于 bash 中的 Ctrl+R)

    IDLE ide中是否有相当于python的东西bash 中的 Ctrl R http www lornajane net posts 2011 navigating bash history with ctrlr 您在其中键入该行的一部分
  • boost share_mutex 的示例(多次读取/一次写入)?

    我有一个多线程应用程序 必须经常读取一些数据 并且偶尔会更新数据 现在 互斥体可以安全地访问该数据 但它很昂贵 因为我希望多个线程能够同时读取 并且仅在需要更新时将它们锁定 更新线程可以等待其他线程完成 我想这就是boost shared
  • GNU make - 强制 PHONY 目标的依赖顺序

    我有一个如下的 Makefile 我关心的是依赖顺序up clean PHONY up up down docker compose up d PHONY up clean up clean down clean up PHONY down
  • 如何通过 url 从服务器下载音频文件

    如何通过 url 从服务器下载音频文件并将其保存到 SD 卡 我正在使用下面的代码 public void uploadPithyFromServer String imageURL String fileName try URL url
  • 无法在 Azure DevOps CD 上部署 DacPac

    我正在建设DacPac使用 Visual Studio 从数据库项目中获取文件 另外 在调试Drop tab in Advanced Build Settings 我启用了以下选项 不要丢弃凭据 不要删除数据库角色 不要删除数据库范围的凭据
  • 向 UIScrollView 添加垂直两指滑动手势

    根据如何为所有屏幕的 iPhone 应用程序添加垂直滑动手势 https stackoverflow com questions 4640000 how to add a vertical swipe gesture to iphone a
  • Predis 给出“从服务器读取行时出错”

    我在用predis https github com nrk predis 它已订阅频道并正在收听 它抛出以下错误 如下 并在 60 秒后死亡 这肯定不是我的网络服务器错误或其超时 有一个类似的问题正在讨论here https github
  • 为像素分配负值

    使用某些标准 图像中有一些我不感兴趣的像素 所以 我想忽略它们 我只是想问一下我所遵循的方法是否可以接受 我已为这些像素分配了负值 这样可以接受吗 当像素具有负值时意味着什么 它会在图像上有一些表现吗 如果您的数据类型允许 例如有符号整数
  • 如何判断无扩展名图像是 png 还是 jpeg

    不久前 我保存了一些由网络服务生成的图像 因此文件名例如 ysauyft87ggsa67fgeg w 1600 我可以打开并操作这些图像 好的 我只想知道它们是什么编码 几乎可以肯定是 png 或 jpeg 我已经在 OSX 中尝试过 获取
  • Chrome 在来自第 3 方 IFRAME 时不会保留我的 _SESSION 变量,但在直接访问时可以完美运行

    直到几周后 我所有的网站都运行良好 我编写代码并在 CodeCanyon 上出售 但最近 今天 我注意到我无法再登录我在那里出售的 PHP 小代码片段 如果我直接在我的域上工作 就像在 URL 栏中输入链接一样 那么在任何浏览器中一切都会完
  • 在Python中使用numpy和scipy在matplotlib中制作分箱箱线图

    我有一个包含值对的二维数组 我想通过 x 值的不同箱来绘制 y 值的箱线图 IE 如果数组是 my array array 1 40 5 4 5 60 然后我想对 my array 0 进行分箱 然后对于每个分箱 生成属于每个框中的相应 m
  • 语法错误:WITH 在此位置输入无效

    所以我有这个类似的请求 WITH customers in usa AS SELECT customerName state FROM customers WHERE country USA SELECT customerName FROM
  • 查找字符串中重复的单词并计算重复次数

    我需要找到字符串上重复的单词 然后计算它们重复的次数 基本上 如果输入字符串是这样的 String s House House House Dog Dog Dog Dog 我需要创建一个不重复的新字符串列表 并将每个单词的重复次数保存在其他
  • 更改 viewpager 中当前片段的背景图像

    我在 viewpager 中有 4 个片段 FragmentStatePagerAdapter 在我的 viewpager 所在的活动中 FragmentStatePagerAdapter 的 newInstance 方法将布局 id 作为