重新创建活动后的空白片段

时间:2017-05-14 22:27:41

标签: android android-fragments

我有Activity ViewPagerTabLayout。我启用了#34;销毁活动"从我手机中的设置模拟低内存。

我使用getSupportFragmentManager,因为它是Activity。 我第一次打开活动时,看到了我的碎片。当我最小化我的应用并重新打开它时,我会看到标签但不是内容。在内部片段中,我称之为setRetainInstance(true)

当然,如果我拨打super.onCreate(null);而不是super.onCreate(savedInstanceState);,它的工作正常,因为活动正在重新创建。

如果我使用FragmentStatePagerAdapter,则内容正常,但菜单会显示重复的项目。

所以请不要建议FragmentStatePagerAdapter(希望所有片段都可见),getChildFragmentManagerViewPager位于Activity),setRetainInstance (已经使用过它了。)

public class SystemActivity extends LoadingActivity {

    @BindView(R.id.pager)
    ViewPager viewPager;

    @BindView(R.id.tab_layout)
    TabLayout tabLayout;

    @BindView(R.id.toolbar)
    Toolbar toolbar;

    int[] ICONS = {
        R.drawable.ic_tab_general,
        R.drawable.ic_tab_details
    };

    int[] TEXTS = {
            R.string.general,
            R.string.details,
    };

    private CustomPagerAdapter customPagerAdapter;

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

        fetch();
    }

    protected void fetch() {
        super.fetch();

        final Long systemId = getIntent().getLongExtra(Constants.Intent.SYSTEM_ID, 0);

        this.realm = Realm.getDefaultInstance();

        this.call = ApiClientHelper.getInstance(this).getSystem(systemId);
        call.enqueue(new ApiUICallback<System>(this) {
            @Override
            public void onError(int code, String message) {
                System system = realm.where(System.class).equalTo("id", systemId).findFirst();
                if (system == null) {
                    fail();
                } else {
                    init(system);
                }
            }

            @Override
            public void onSuccess(System system) {
                realm.beginTransaction();
                realm.copyToRealmOrUpdate(system);
                realm.commitTransaction();
                init(system);
            }
        });
    }

    private void init(System system) {
        setContentView(R.layout.activity_system);
        ButterKnife.bind(this);

        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        customPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager(), system);
        viewPager.setOffscreenPageLimit(TEXTS.length);
        viewPager.setAdapter(customPagerAdapter);
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);

        CharSequence title = customPagerAdapter.getPageTitle(0);
        getSupportActionBar().setTitle(title);

        for (int i = 0; i < ICONS.length; i++) {
            TabLayout.Tab tab = tabLayout.getTabAt(i);

            tab.setCustomView(R.layout.tab_view);
            ((ImageView) tab.getCustomView().findViewById(R.id.icon)).setImageResource(ICONS[i]);
        }

        tabLayout.setOnTabSelectedListener(
                new TabLayout.OnTabSelectedListener() {
                    @Override
                    public void onTabSelected(TabLayout.Tab tab) {
                        CharSequence title = customPagerAdapter.getPageTitle(tab.getPosition());
                        getSupportActionBar().setTitle(title);

                        hiddenKeyboard();
                    }

                    @Override
                    public void onTabUnselected(TabLayout.Tab tab) {
                        hiddenKeyboard();
                    }

                    @Override
                    public void onTabReselected(TabLayout.Tab tab) {
                        hiddenKeyboard();
                    }
                }
        );
    }

    private void hiddenKeyboard() {
        View focus = getCurrentFocus();
        if (focus != null) {
            focus.clearFocus();
            InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.hideSoftInputFromWindow(focus.getWindowToken(), 0);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    class CustomPagerAdapter extends FragmentPagerAdapter {

        private System system;

        public CustomPagerAdapter(FragmentManager fm, System system) {
            super(fm);

            this.system = system;
        }

        @Override
        public Fragment getItem(int position) {
            Fragment fragment;
            switch (position) {
                case 0:
                    fragment = new SystemGeneralFragment();
                    break;
                case 1:
                    fragment = new SystemDetailsFragment();
                    break;
                default:
                    return null;
            }

            Bundle bundle = new Bundle();
            bundle.putLong(Constants.Intent.SYSTEM_ID, this.system.getId());
            fragment.setArguments(bundle);

            return fragment;
        }

        @Override
        public int getCount() {
            return TEXTS.length;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return getResources().getString(TEXTS[position]);
        }
    }
}

我的一个片段:

public class SystemGeneralFragment extends MyFragment {

    @BindView(R.id.progress)
    View progress;

    @BindView(R.id.progress_background)
    View progressBackground;

    @BindView(R.id.progress_percentage)
    TextView percentage;

    protected Call call;
    protected Realm realm;

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

        realm = Realm.getDefaultInstance();
    }

    @Override
    public void onDestroyView() {
        if (this.call != null) {
            this.call.cancel();
        }

        super.onDestroyView();
    }

    @Override
    public void onDestroy() {
        realm.close();

        super.onDestroy();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_system_general, container, false);
        ButterKnife.bind(this, view);

        System system = realm.where(System.class).equalTo("id", getArguments().getLong(Constants.Intent.SYSTEM_ID)).findFirst();

        System.Status status = system.getStatus();

        percentage.setText(String.format("%d%%", status.getProgress()));

        setProgress(progress, status.getColor(getContext()));
        setProgress(progressBackground, ContextCompat.getColor(getContext(), R.color.light_gray));


        return view;
    }

    private void setProgress(View view, int color) {
        GradientDrawable shape = new GradientDrawable();
        shape.setCornerRadius(16);

        shape.setColor(color);
        if (Build.VERSION.SDK_INT >= 16) {
            view.setBackground(shape);
        } else {
            view.setBackgroundDrawable(shape);
        }
    }

}

0 个答案:

没有答案