保留视图寻呼机片段布局的更改

时间:2014-01-17 18:53:11

标签: android android-layout android-fragments android-viewpager

我有一个带有3个片段的ViewPager,每个片段都有自己独特的布局。每个片段通过从包含ViewPager的FragmentActivity获取newInstance()方法中的布局id作为参数来了解要使用的布局。此ViewPager由名为MyPagerAdapter的FragmentStatePagerAdapter控制。

public class MainActivity extends FragmentActivity {
     ViewPager pager;
    @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 class MyPagerAdapter extends FragmentStatePagerAdapter {
        SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

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

        @Override
        public Fragment getItem(int pos) {
            switch(pos) {
            case 0: return FirstFragment.newInstance("FirstFragment, Instance 1");
            case 1: return SecondFragment.newInstance("SecondFragment, Instance 1");
            case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1");
            }
        }

        @Override
        public int getCount() {
            return 3;
        }     
         @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 void setBackgroundImage(View view){
        int i = pager.getCurrentItem();
        Fragment page = ((MyPagerAdapter)pager.getAdapter()).getRegisteredFragment(i);
        page.getView().findViewById(R.id.first).findViewById(R.id.button1);
        page.getView().findViewById(R.id.first).setBackgroundResource(R.drawable.ic_launcher);
    }
}

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" >
<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"
    />
</RelativeLayout>

这是FirstFragment:

public class FirstFragment extends Fragment{
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.first_frag, container, false);

            TextView tv = (TextView) v.findViewById(R.id.tvFragFirst);
            tv.setText(getArguments().getString("msg"));

            return v;
        }

        public static FirstFragment newInstance(String text) {

            FirstFragment f = new FirstFragment();
            Bundle b = new Bundle();
            b.putString("msg", text);

            f.setArguments(b);

            return f;
        }}

first_frag.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_orange_dark"
    android:id="@+id/first" >

    <TextView
        android:id="@+id/tvFragFirst"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:textSize="26dp"
        android:text="TextView" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/tvFragFirst"
        android:text="Button" 
        android:onClick="setBackgroundImage"/>
</RelativeLayout>

它有更多的按钮和图像按钮与onClick方法,但它没有必要的问题,除了知道我有许多类似于setBackgroundImage的onClick方法改变布局的外观是很重要的。

SecondFragment和ThirdFragment与它们的布局类似。

正如您在MainActivity中可以看到方法setBackgroundImage一样,它会更改片段的背景图像。但是一旦它改变了,它就不是永久性的,因为当我翻阅片段并返回到第一个片段时,不会保存更改,但会显示原始布局。我知道,一旦出于视觉,片段的布局就会被破坏。有没有办法保留布局变化?

1 个答案:

答案 0 :(得分:0)

您是否尝试在Fragments onCreate()方法中调用onRetainInstance(true)?

当然,解决问题的一种方法是在Activity中存储每个片段的后台资源,以便在创建片段时正确初始化它们。这还涉及将背景数据存储在onSaveInstanceState()方法的包中。