有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java保持对象在屏幕上旋转?

我知道这里已经讨论过很多次了,但我仍然没有找到解决办法。我正在使用ViewPager为Android创建“向导”组件,其中包含一些片段(多少片段取决于使用此扩展的开发人员),我需要保存向导状态。我发现的唯一方法是在使用此扩展时强制开发人员声明静态片段,但我真的不喜欢这样做(因为这对开发人员来说更复杂,我希望使其尽可能易于使用)

我的扩展类:

public class WizardActivity extends AppCompatActivity {

    private WizardAdapter wizardAdapter;
    private WizardPager wizardPager;
    private Button buttonNext;
    private Button buttonPrevious;
    private int wizardPagerID;
    private int buttonNextID;
    private int buttonPreviousID;
    private int layoutID;
    private boolean swipeEnabled;

    public WizardActivity(int layoutID, int buttonNext, int buttonPrevious, int wizardPager, boolean swipeEnabled) {
        super();
        this.wizardAdapter = new WizardAdapter(getSupportFragmentManager());
        this.wizardPagerID = wizardPager;
        this.buttonNextID = buttonNext;
        this.buttonPreviousID = buttonPrevious;
        this.layoutID = layoutID;
        this.swipeEnabled = swipeEnabled;
    }

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

        wizardPager = (WizardPager) findViewById(wizardPagerID);
        buttonNext = (Button) findViewById(buttonNextID);
        buttonPrevious = (Button) findViewById(buttonPreviousID);

        wizardPager.setAdapter(wizardAdapter);
        wizardPager.setSwipeEnabled(swipeEnabled);

        buttonNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onNextButton(wizardPager.getCurrentItem())) {
                    wizardPager.showNext();
                    refreshButtons();
                }
            }
        });

        buttonPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(onPreviousButton(wizardPager.getCurrentItem())) {
                    wizardPager.showPrevious();
                    refreshButtons();
                }
            }
        });

        if(savedInstanceState != null) {
            wizardPager.setCurrentItem(savedInstanceState.getInt("page", 0));
        }

        refreshButtons();
    }

    @Override
    public void onBackPressed() {
        if (wizardPager.getCurrentItem() == 0) {
            super.onBackPressed();
        } else {
            wizardPager.showPrevious();
            refreshButtons();
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("page", wizardPager.getCurrentItem());
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        refreshButtons();
    }

    public WizardPager getWizardPager() { return wizardPager; }
    public WizardAdapter getWizardAdapter() { return wizardAdapter; }
    public Button getButtonNext() { return buttonNext; }
    public Button getButtonPrevious() { return buttonPrevious; }

    public void addWizardFragment(WizardFragment fragment) { wizardAdapter.addFragment(fragment); }

    public boolean showNextFragment() {
        return onNextButton(wizardPager.getCurrentItem()) && wizardPager.showNext();
    }
    public boolean showPreviousFragment() {
        return onPreviousButton(wizardPager.getCurrentItem()) && wizardPager.showPrevious();
    }

    public void refreshButtons() {
        WizardFragment currentFragment = wizardAdapter.getItem(wizardPager.getCurrentItem());
        buttonPrevious.setEnabled(currentFragment.isPreviousEnabled());
        buttonPrevious.setText(currentFragment.getPreviousText());
        buttonNext.setEnabled(currentFragment.isNextEnabled());
        buttonNext.setText(currentFragment.getNextText());
    }

    public boolean onNextButton(int currentItem) {
        return true;
    }

    public boolean onPreviousButton(int currentItem) {
        return true;
    }
}

其他开发人员的类可以如下所示:

public class SetupActivity extends WizardActivity {

    private static SetupFragment setupFragment = new SetupFragment();
    private static SetupLicenseFragment setupLicenseFragment = new SetupLicenseFragment();
    private static SetupLoginFragment setupLoginFragment = new SetupLoginFragment();

    public SetupActivity() {
        super(R.layout.activity_setup, R.id.button2, R.id.button3, R.id.pager, false);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        String previousText = getString(R.string.setup_button_previous);
        String nextText = getString(R.string.setup_button_next);
        String finishText = getString(R.string.setup_button_finish);

        setupFragment.setupFragment(previousText, nextText, false, true);
        setupLicenseFragment.setupFragment(previousText, nextText, true, false);
        setupLoginFragment.setupFragment(previousText, finishText, true, false);

        addWizardFragment(setupFragment);
        addWizardFragment(setupLicenseFragment);
        addWizardFragment(setupLoginFragment);

        super.onCreate(savedInstanceState);
    }

    @Override
    public boolean onNextButton(int currentItem) {
        if(currentItem == 2) {
            Intent intent = new Intent(SetupActivity.this, MainActivity.class);
            startActivity(intent);
            finish();
            return false;
        }
        return super.onNextButton(currentItem);
    }
}

(WizardAdapter包含WizardFragments的ArrayList)

有没有一种方法可以保存其他开发人员添加的片段,而不会使开发人员感到更困难


共 (1) 个答案

  1. # 1 楼答案

    在activity类中创建fragments静态字段是一个相当糟糕的主意,android会在配置更改期间重新创建fragments,这样静态实例就会被销毁。对于未保留的片段也是如此,但保留的片段主要用于保存数据,而不是构建UI

    我建议您使用getFragmentManager().findFragmentByTagWizardActivity.OnCreate内重新创建向导管理器。标签应该在来自基本活动的初始addWizardFragment( ... );调用期间存储——您可以很容易地从传入的片段实例中获取它们。当然,所有其他状态都应该使用Handling Runtime Changes中描述的正常过程保存

    在配置更改期间,客户端不应调用addWizardFragment。所以他们应该写:

    if ( savedInstanceState == null ) {
        addWizardFragment(setupFragment);
        addWizardFragment(setupLicenseFragment);
        addWizardFragment(setupLoginFragment);
    }