草庐IT

android - 回到主 Fragment 实例后,FragmentStatePagerAdapter 没有重新创建 Fragments

coder 2023-12-22 原文

范围

我正在申请我的大学盛会,其中显示了 4 个特定日期的 Activity 。 我有一个 main_activity,它有一个线性布局,每个 fragment 都显示在上面。现在我有一个 fragment “ScheduleFragment”。

ScheduleFragment 由一个 ViewPager 和一个 FragmentStatePagerAdapter 组成,可以在 4 个日期之间切换。

ViewPager 有 4 个页面代表 4 个日期,这 4 个页面来自同一 fragment 的 4 个引用,即“ScheduleListSubFragment

用户从这里选择一个事件并可以查看包含在“EventDescriptionFragment”中的 eventDescription

问题

流程顺利。用户遇到 ScheduleFragment,然后切换到适当的日期并选择一个事件。

现在,当他从 EventDescriptionFragment 返回到 ScheduleFragment(稍后我将说明我是如何做的)时,ViewPager 显示空白 View 。当我们滑动到下一个日期时,下一个日期的事件来了,当我们滑动回到上一个日期时,上一个日期的事件又回来了。

我调试了我的应用程序并了解到,当我们返回到 ScheduleFragment 时,viewpager 不会为 ScheduleListSubFragment 创建新的 fragment 实例,除非我滚动 viewpager。

所以,我想 ViewPager 能够带来用户正在查看的特定引用(ScheduleListSubFragment)。

我如何返回到 ScheduleFragment? 我在 main_activity 中创建了一个堆栈。当用户选择一个事件时,我将 ScheduleFragment 的当前引用插入堆栈。当按下返回键时,我会弹出该引用并将其放置在屏幕上。

代码 *ScheduleFragment* 导入 com.Nit_kkr.updates.app.adapters.ScheduleFragmentAdapter; 导入 com.viewpagerindicator.PageIndicator; 导入 com.viewpagerindicator.TitlePageIndicator; 导入 com.viewpagerindicator.TitlePageIndicator.IndicatorStyle;

        import android.os.Bundle;
        import android.support.v4.app.Fragment;
        import android.support.v4.view.ViewPager;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.TextView;
        import android.widget.Toast;

        public class ScheduleFragment extends Fragment{
            ScheduleFragmentAdapter mAdapter;
            ViewPager mPager;
            PageIndicator mIndicator;
            TitlePageIndicator indicator;




            @Override
            public void onViewStateRestored(Bundle savedInstanceState) {
        //      Toast.makeText(getActivity(), " onViewStateRestored()", Toast.LENGTH_SHORT).show();
                super.onViewStateRestored(savedInstanceState);
            }

            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                mAdapter = new ScheduleFragmentAdapter(getActivity().getSupportFragmentManager());
                mAdapter.notifyDataSetChanged();
            }

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
                View v = inflater.inflate(R.layout.scheduled_list, null);
                prepareSlidingPager(v);

                return v;
            }

            private void prepareSlidingPager(View v)
            {

                    mPager = (ViewPager)v.findViewById(R.id.pager);

                    mPager.setOffscreenPageLimit(4);
                    mPager.setAdapter(mAdapter);

                    mIndicator = (TitlePageIndicator)v.findViewById(R.id.indicator);
                    indicator = (TitlePageIndicator) mIndicator;
                    mIndicator.setViewPager(mPager);

                    final float density = getResources().getDisplayMetrics().density;
                    indicator.setBackgroundColor(0x18AF0000);
                    indicator.setFooterColor(0xFFAA2222);

                    //indicator.setFooterColor(0xFFAA33);

                    indicator.setFooterLineHeight(2 * density); //1dp
                    indicator.setFooterIndicatorHeight(3 * density); //3dp
                    indicator.setFooterIndicatorStyle(IndicatorStyle.Underline);

                    indicator.setTextColor(0xAA000000);
                    indicator.setSelectedColor(0xFF000000);
                    indicator.setSelectedBold(true);
            }


            public static ScheduleFragment newInstance()
            {
                ScheduleFragment frag = new ScheduleFragment();
                return frag;
            }
        }

ScheduleListSubFragment:

            public class ScheduleListSubFragment extends Fragment implements OnItemClickListener{

                long startDate;
                long endDate;


                private ListView eventlist;
                private listadapter adapter;
                private List events;
                private MyDB db;



                @Override
                public void onAttach(Activity activity) {
                    Toast.makeText(getActivity(), " onAttatch()------------------sublist schedule", Toast.LENGTH_SHORT).show();
                    super.onAttach(activity);
                }

                @Override
                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);

                    db=new MyDB(this.getActivity());

                    Toast.makeText(getActivity(), " onCreate()------------------sublist schedule", Toast.LENGTH_SHORT).show();

                }

                @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {

                    //Toast.makeText(getActivity(), " onCreateView()------------------sublist schedule", Toast.LENGTH_SHORT).show();

                    View v = inflater.inflate(R.layout.eventslist_subfragment_layout, null);

                    eventlist=(ListView)v.findViewById(R.id.Event_list);
                    eventlist.setOnItemClickListener(this);

                    fetcheventdata(getArguments().getLong("start_time"), getArguments().getLong("end_time"));
                    return v;

                }

                public static ScheduleListSubFragment newInstance(long starttime, long endtime)
                {
                    ScheduleListSubFragment frag = new ScheduleListSubFragment();
                    Bundle bundle = new Bundle();

                    bundle.putLong("start_time", starttime);
                    bundle.putLong("end_time", endtime);
                    frag.setArguments(bundle);

                    return frag;
                }



                 private void fetcheventdata(long starttime, long endtime)
                    {

                        db.open();
                        events=db.getEvents_bycategory_bytime(null, starttime, endtime);
                        db.close();
                        if(events!=null)
                        {
                        adapter=new listadapter(getActivity(), android.R.layout.simple_expandable_list_item_1, events);
                        eventlist.setAdapter(adapter);

                        adapter.notifyDataSetChanged();
                        }
                        else
                            Toast.makeText(getActivity(), "No Events Yet", Toast.LENGTH_LONG);

                        //Toast.makeText(getActivity(), events.size(), Toast.LENGTH_LONG).show();



                    }


                 private class listadapter extends ArrayAdapter<Event>
                    {
                        private List items;

                        public listadapter(Context context, int textViewResourceId,
                                List objects){
                            super(context, textViewResourceId, objects);
                            items=new ArrayList();
                            items=objects;

                        }

                        @Override
                        public View getView(int position, View convertView, ViewGroup parent) {

                            View v=convertView;

                            if(v==null)
                            {
                                LayoutInflater vi=(LayoutInflater)getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                                v=vi.inflate(R.layout.upcominglist, null);

                            }

                            Event event=(Event)items.get(position);
                            if(event!=null)
                            {
                                TextView name=(TextView)v.findViewById(R.id.Name);
                                TextView venue=(TextView)v.findViewById(R.id.Venue);
                                TextView time=(TextView)v.findViewById(R.id.time);


                                name.setTypeface(Utils.getHeroFace(getActivity().getAssets()));
                                venue.setTypeface(Utils.getHeroFace(getActivity().getAssets()));

                                name.setTextColor(getResources().getColor(R.color.black));
                                venue.setTextColor(getResources().getColor(R.color.darkgrey));
                                time.setTextColor(getResources().getColor(R.color.black));


                                //ImageView favouriteicon=(ImageView)v.findViewById(R.id.fav_status_image);
            //                  ImageView remindericon=(ImageView)v.findViewById(R.id.reminder_status_image);

                                name.setText(event.getName());
                                time.setText(Html.fromHtml("<b>"+event.getEvent_time()+"</b><br></br>"+event.getEvent_date()));
                                venue.setText(event.getVenue());


                            }
                            return v;
                        }

                    }


                 @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
                        eventnotifierapp app=(eventnotifierapp)getActivity().getApplication();
                        app.crntEvent=(Event) events.get(pos);
                        //startActivity(new Intent(this.getActivity(), EventDescription.class));

                        EventDescriptionFragment frag = EventDescriptionFragment.NewInstance();
                        ((MainActivity)getActivity()).OpenNextFragment(frag);

                    }

            }

ScheduleFragmentAdapter:

    public class ScheduleFragmentAdapter extends FragmentStatePagerAdapter{
        String cat_name;

        protected static final String[] CONTENT = new String[] { "Thursday, Feb 20", 
            "Friday, Feb 21", "Saturday, Feb 22", "Sunday, Feb 23", };

        private int mCount = CONTENT.length;

        public ScheduleFragmentAdapter(FragmentManager fm) {
            super(fm);


        }

        @Override
        public Fragment getItem(int position) {
            if(position == 0)
                return ScheduleListSubFragment.newInstance(day1start, day1end);
            if(position == 1)
                return ScheduleListSubFragment.newInstance(day2start, day2end);
            if(position == 2)
                return ScheduleListSubFragment.newInstance(day3start, day3end);
            else 
                return ScheduleListSubFragment.newInstance(day4start, day4end);
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
          return CONTENT[position % CONTENT.length];
        }
    }

研究 我在stackOverFlow上做了一些挖掘,发现了一些相关的查询,这些查询不完全相同,但无法得出解决方案

非常感谢任何类型的帮助。

最佳答案

您好,让您的代码运行起来,帮助我解决您的问题的是: 1. 使用 getChildFragmentManager() 来初始化您的适配器:

fragadapter = new myfragmentAdapter(getChildFragmentManager());

这会给你运行时错误吧?? 那是因为在后退按钮应用程序上没有您的 fragment 上下文(根据我的意见)所以请将您的 fragment 添加到后退堆栈中,如:

public void addpagerfragment(View v)
    {
        pagerFragment frag = pagerFragment.NewInstance();
        crrntfrag = frag;

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.container, frag).addToBackStack(null);
        ft.commit();

    }

关于android - 回到主 Fragment 实例后,FragmentStatePagerAdapter 没有重新创建 Fragments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20451398/

有关android - 回到主 Fragment 实例后,FragmentStatePagerAdapter 没有重新创建 Fragments的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  6. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  7. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  8. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  9. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  10. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

随机推荐