【问题标题】:Fragment getView gives null after suspend暂停后片段 getView 给出 null
【发布时间】:2013-01-17 18:59:54
【问题描述】:

为了专注于问题,我以以下测试应用程序结束,其中包含一个活动和两个连接到 FragmentStatePagerAdapter / ViewPager 的片段。我也有 Runnable 和 Handler 每秒打印 getView() (在生产版本中,它用于在片段的 TextView 中显示时间)。

当我启动应用程序时,getView() 可能显示几个空值(我想是由于片段生命周期),然后我得到一些非空值,这没关系...

但是如果我暂停并唤醒我的设备 LogCat 一直显示空值。

public class MainActivity extends SherlockFragmentActivity {

    private SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    private Fragment myFragment1 = new MyFragment1();
    private Fragment myFragment2 = new MyFragment2();

    private Handler handler = new Handler();
    private Runnable timer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        viewPager.setAdapter(sectionsPagerAdapter);
    }

    @Override
    protected void onResume() {
        super.onResume();

        timer = new Runnable() {
            public void run() {
                System.out.println(myFragment1.getView()); // HERE getView gives null
                handler.postDelayed(this, 1000); // refreshing every 1 sec
            }
        };

        handler.removeCallbacks(timer);
        handler.postDelayed(timer, 0);
    }

    @Override
    protected void onPause() {
        super.onPause();

        handler.removeCallbacks(timer);
    }

    public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Fragment fragment;

            if (position == 0) {
                fragment = myFragment1;
            } else {
                fragment = myFragment2;
            }

            return fragment;
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
            case 0:
                return "Fragment 1";
            case 1:
                return "Fragment 2";
            }
            return null;
        }

    }
}

我的片段

public class MyFragment1 extends SherlockFragment {

    private TextView textView2;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_layout, container, false);
    }

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

        ((TextView) getView().findViewById(R.id.textView1)).setText("Fragment 1");

        textView2 = (TextView) this.getView().findViewById(R.id.textView2);
    }

    public void updateTextView2(String text) {
        textView2.setText(text);
    }

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    好的,我只需添加以下内容即可解决我的问题:

    if (myFragment1.getView() == null) {
        viewPager.setAdapter(sectionsPagerAdapter);
    }
    

    我对这个解决方案不满意,但它确实有效......

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2020-01-05
      • 2013-10-07
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      相关资源
      最近更新 更多