jjzjj

android - 保留 fragment 不保留

coder 2023-12-22 原文

我有一个包含 VideoView 的简单布局。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/black"
android:gravity="center" >

<VideoView
    android:id="@+id/videoPlayer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

</RelativeLayout>

使用此布局的 Activity 创建一个 Fragment 来启动 VideoView

public class VideoPlayerActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_video_player);
            createNewWorkerFragment();
    }

        private void createNewWorkerFragment() {
            FragmentManager fragmentManager = getFragmentManager();
            VideoPlayerActivityWorkerFragment workerFragment = (VideoPlayerActivityWorkerFragment)fragmentManager.findFragmentByTag(VideoPlayerActivityWorkerFragment.Name);
            if (workerFragment == null) {
                workerFragment = new VideoPlayerActivityWorkerFragment();
                fragmentManager.beginTransaction()
                               .add(workerFragment, VideoPlayerActivityWorkerFragment.Name)
                               .commit();
            }
        }
}

VideoPlayerActivityWorkerFragment如下:

public class VideoPlayerActivityWorkerFragment extends Fragment {

     public static String Name = "VideoPlayerActivityWorker";
     private VideoView mVideoPlayer;

     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setRetainInstance(true);
         mVideoPlayer = (VideoView) mActivity.findViewById(R.id.videoPlayer);
         mVideoPlayer.setVideoPath(mActivity.getIntent().getExtras().getString("path"));
         MediaController controller = new MediaController(mActivity);
         controller.setAnchorView(mVideoPlayer);
         mVideoPlayer.setMediaController(controller);
         mVideoPlayer.requestFocus();
         mVideoPlayer.start();
     }

     @Override
     public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = activity;
     }

     @Override
     public void onDetach() {
        super.onDetach();
        mActivity = null;
     }
}

这是我遇到的问题,当 VideoPlayerActivity 启动时 VideoPlayerActivityWorkerFragment 被创建并且 VideoView 开始播放,但是当我旋转设备视频停止播放,整个 View 似乎从布局中消失了。由于 setRetainInstance(true);,我认为 VideoView 会继续播放。有人可以让我知道我做错了什么吗?我在别处使用过这种模式(不是 VideoView),它成功地实现了旋转。

我不愿意使用 android:configChanges="keyboardHidden|orientation|screenSize" 或类似的方法,我想用 Fragment 来处理方向变化。

预先感谢您的帮助。

编辑

我最终选择了我所做的解决方案,因为它有效。每次onCreateView都需要重新创建videoview和controller,在onResume中设置播放位置,在onPause中重新写入。但是,在旋转过程中播放时断断续续的。该解决方案不是最优的,但它确实有效。

最佳答案

参见 mVideoPlayer = (VideoView) mActivity.findViewById(R.id.videoPlayer); 您的 VideoView 是由正在被销毁并在旋转时重新创建的 Activity 创建的。这意味着正在创建一个新的 R.id.videoPlayer VideoView。所以你的本地 mVideoPlayer 只是在你上面的行中被覆盖了。您的 fragment 需要在其 onCreateView() 方法中创建 VideoView。即便如此,这可能还不够。因为 Views 与它们拥有的 Context 有着内在的联系。也许一个明确的暂停、检测和附加、播放 View 将是一个更好的方法。

关于android - 保留 fragment 不保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17513763/

有关android - 保留 fragment 不保留的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby - 为什么 Ruby 在抛出 NameError 异常后仍保留代码求值? - 2

    我无法向自己解释的简单代码:putsaifa=1这导致warning:found=inconditional,shouldbe==NameError:undefinedlocalvariableormethod'a'formain:Object不过,现在检查a我们可以看到,它已被定义:a#=>1尽管抛出异常,为什么a仍被分配给1?来自docs:Theconfusioncomesfromtheout-of-orderexecutionoftheexpression.Firstthelocalvariableisassigned-tothenyouattempttocallanonexis

  3. ruby - whenever gem 能否保留 crontab 文件中的现有行? - 2

    我正在使用:ruby1.9.2每当0.7.2Capistrano2.9.0capistrano-ext1.2.1我在部署时与Capistrano结合使用来管理我的crontab文件。我注意到它每次都会完全重写我的crontab文件。我希望能够在cron中设置环境变量来控制PATH和MAILTO设置,它们是常规的cron环境变量。有没有办法让whenever不覆盖整个crontab文件,以便我可以将自定义添加到我的crontab文件并确保它们会持续存在? 最佳答案 是的,你可以做到这一点。您只需要为写入crontab的任务分配一个标识

  4. ruby - "begin"和 "end"是不是保留字? - 2

    我对Ruby中的保留字有点困惑。Matz与人合着的《TheRubyProgrammingLanguage》说begin和end是语言的保留字。它们肯定在句法上用于标记block。但是,该语言中的范围对象具有名为begin和end的方法,如(1..10).end=>10现在,对此进行测试,我发现我确实可以在对象上定义名为“begin”和“end”的方法,但如果我尝试将变量命名为“begin”,它会失败。(这里有一个使用它作为方法名的示例,它确实有效......:)classFoodefbeginputs"hi"endendFoo.new.begin所以,我想我是在问,像这样的保留字的实际

  5. ruby - 在 Ruby 哈希中查找保留重复项 - 2

    我有一个散列数组,我需要在其中根据散列之间的一个匹配值查找和存储匹配项。a=[{:id=>1,:name=>"Jim",:email=>"jim@jim.jim"},{:id=>2,:name=>"Paul",:email=>"paul@paul.paul"},{:id=>3,:name=>"Tom",:email=>"tom@tom.tom"},{:id=>1,:name=>"Jim",:email=>"jim@jim.jim"},{:id=>5,:name=>"Tom",:email=>"tom@tom.tom"},{:id=>6,:name=>"Jim",:email=>"jim

  6. ruby - 我们如何访问/操作与 byebug 保留关键字冲突的变量名? - 2

    我们如何访问那些与byebug保留名称冲突的变量名称?(byebug)varlocalh={"hierarchyId"=>"59f0b029e4b037ef11a055f7","level"=>2,...self=(byebug)我想访问变量“h”但键入h会显示“byebug的帮助对话框”(byebug)hbreak--Setsbreakpointsinthesourcecodecatch--Handlesexceptioncatchpointscondition--Setsconditionsonbreakpointscontinue--Runsuntilprogramends,hi

  7. ruby - 将正文拆分成句子但保留标点符号? - 2

    我正在尝试在2个html负载文本主体之间产生类似wiki的人类可读差异。我正在使用diff-lcs,第一步是将字符串(字符数组)分成句子数组,但保留标点符号。"Iamalion.Hearmeroar!Whereismycub?Nevermind,foundhim.".magic_split(/[.?!]/)#=>"Iamalion.""Hearmeroar!""Whereismycub?""Nevermind,foundhim."这应该可以解决问题"Iamalion.Hearmeroar!Whereismycub?Nevermind,foundhim.".gsub(/[.?!]/,'\

  8. ruby - 在保留所有 gem 的同时通过 rvm 升级到 Ruby 2.3 的最佳方法? - 2

    通过rvm升级到Ruby2.3的最佳方法是什么,同时保持所有gem安装在以前的版本上(例如json、nokogiri、等等)? 最佳答案 编辑这个问题在这里有答案:RVM:Howtousegemsfromadifferentruby?$rvmgemsetcopy$oldversion2.3.0##Assignorreplace$oldversionwitholdversionname原创在安装Ruby2.3之前,使用gemlist获取已安装的gem及其版本的列表。然后,在安装Ruby2.3之后,使用rvm将2.3设置为新的默认值:$

  9. ruby - 使用 rake 复制保留目录结构的文件 - 2

    我的目标是将一组由模式指定的文件复制到目标目录。源目录中的文件可以有子目录。我试过:cp_r(Dir.glob('**/*.html'),@target_dir):和cp_r(FileList['**/*.html'],@target_dir):但都不起作用。它只在我做类似的事情时有效:cp_r(Dir['.'],@target_dir):但我只需要复制*.html文件而不是其他任何文件。我需要什么cp--parents命令确实对使用现有的Ruby/Rake方法有什么建议吗?更新看起来用Ant更容易做的事情,用Ruby/Rake堆栈是不可能的-可能我需要研究其他东西。我不想编写自定义代

  10. Ruby - 当我打印出字符串时如何保留\n - 2

    当我在ruby​​中打印字符串时,我想保留\n,像现在一样,如果我使用puts或print,\n将以换行结束:pry(main)>print"abc\nabc"abcabc有没有办法让ruby​​像这样打印出来:abc\nabc?更新抱歉,我可能没有说得更清楚。我正在调试我的正则表达式,所以当我输出一个字符串时,如果\n显示为\n,而不是换行符,我会更容易检查.所以@slivu的回答正是我想要的。谢谢大家。 最佳答案 我建议使用p而不是puts/print:p"abc\nabc"=>"abc\nabc"事实上,对于pry,您不需要使

随机推荐