【问题标题】:Fragment activity reference after screen rotation屏幕旋转后的片段活动参考
【发布时间】:2013-12-30 20:41:08
【问题描述】:

我有一个Activity 和两个Action bar tabs,每个选项卡中有一个片段。一切正常,直到屏幕旋转。我在我的活动中引用了片段。如果我从我的活动中调用片段的方法并且该方法调用getActivity(),则 getActivity() 返回 null。

我不知道我是否不应该将片段引用作为我的 Activity 类的成员字段。如果我不能在活动类中保留该引用,我如何获取片段布局中某些字段的值。

这是我的活动课:

public class MyActivity extends ActionBarActivity implements ActionBar.TabListener {

    private ViewPager viewPager;
    private MyPagerAdapter pagerAdapter;
    private ActionBar actionBar;
    DetallesAvisoFragment fragment1;
    DetallesPiezaFragment fragment2;
    ActionMode actionMode;

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

        actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);


        viewPager = (ViewPager) findViewById(R.id.viewPager);
        Intent intent = getIntent();
        fragment1 = new Fragment1();
        fragment2 = new Fragment2();
        List<Fragment> fragmentList = new ArrayList<Fragment>();
        fragmentList.add(fragment1);
        fragmentList.add(fragment2);
        pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), fragmentList);
        viewPager.setAdapter(pagerAdapter);
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i2) {

            }

            @Override
            public void onPageSelected(int i) {
                actionBar.setSelectedNavigationItem(i);
            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });
        actionBar.addTab(actionBar.newTab().setText("Frag1 Tab").setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText("Frag2 Tab").setTabListener(this));
    }




    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

    }

    /**
     * This method work properly until screen rotation
     */
    public void getValues() {
        String value1 = fragment1.getValueFromSomeField();
        String value2 = fragment2.getValueFromOtherField();
    }
}

FragmentPagerAdapter 类:

public class MyPagerAdapter extends FragmentPagerAdapter{

    List<Fragment> fragmentList;

    public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        fragmentList = fragments;
    }

    @Override
    public Fragment getItem(int index) {
        if (index >= fragmentList.size()) {
            return null;
        }
        return fragmentList.get(index);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }
}

还有我的 Fragment 类:

public class Fragment1 extends Fragment {

    public Fragment1() {
    }



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


    public String getValueFromSomeField() {
        TextView testView = (TextView) getActivity().findViewById(R.id.someField);
        return testView.getText().toString();
    }
}


public class Fragment2 extends Fragment {

    public Fragment2() {
    }



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


    public String getValueFromSomeOtherField() {
        TextView testView = (TextView) getActivity().findViewById(R.id.someOtherField);
        return testView.getText().toString();
    }
}

注意:我需要对 SDK 8 的支持,所以我必须通过 SupportLibrary 使用 Fragments

【问题讨论】:

    标签: java android android-fragments android-viewpager android-support-library


    【解决方案1】:

    你声明

    static final String STORE_FRAGMENT1 = "fragment1";
    static final String STORE_FRAGMENT2 = "fragment2";
    

    你重写方法onSaveInstanceState来保存标签fragment1和fragment 2;

    @Override
    protected void onSaveInstanceState(Bundle savedInstanceState) {
        if (fragment1 != null) {
            savedInstanceState.putString(STORE_FRAGMENT1,
                    fragment1.getTag());
        }
        if (fragment2 != null) {
            savedInstanceState.putString(STORE_FRAGMENT2,
                    fragment2.getTag());
        }
    
        super.onSaveInstanceState(savedInstanceState);
    }
    

    当 OnCreated 你得到标签 fragment1 和 fragment 2 以便在旋转之前保存 fragment1 和 fragment2

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_edit_avisos);
    
            actionBar = getSupportActionBar();
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
    
            viewPager = (ViewPager) findViewById(R.id.viewPager);
            Intent intent = getIntent();
            //----edit-------
    
            String TagFragment1;
            String TagFragment2;
            if (savedInstanceState != null) {
                        FragmentManager fm = getSupportFragmentManager();
                TagFragment1 = savedInstanceState.getString(STORE_FRAGMENT1);
                fragment1 = (SubjectFragment) fm
                        .findFragmentByTag(TagFragment1);
                TagFragment2 = savedInstanceState.getString(STORE_FRAGMENT2);
                fragment2 = (CircuitFragment) fm
                        .findFragmentByTag(TagFragment2);
    
            }
            else {
                fragment1 = new Fragment1();
                fragment2 = new Fragment2();
            }
            //---end--edit-----
            List<Fragment> fragmentList = new ArrayList<Fragment>();
            fragmentList.add(fragment1);
            fragmentList.add(fragment2);
            pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), fragmentList);
            viewPager.setAdapter(pagerAdapter);
            viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int i, float v, int i2) {
    
                }
    
                @Override
                public void onPageSelected(int i) {
                    actionBar.setSelectedNavigationItem(i);
                }
    
                @Override
                public void onPageScrollStateChanged(int i) {
    
                }
            });
            actionBar.addTab(actionBar.newTab().setText("Frag1 Tab").setTabListener(this));
            actionBar.addTab(actionBar.newTab().setText("Frag2 Tab").setTabListener(this));
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      相关资源
      最近更新 更多