【问题标题】:Keeping Seekbar values when replacing fragment替换片段时保留 Seekbar 值
【发布时间】:2016-04-28 19:10:09
【问题描述】:

我有一个包含 4 个项目(主页、设置、关于、帮助)的导航抽屉。单击该项目时,与该项目对应的片段替换另一个。

现在,我有这个带有 3 个搜索栏的设置片段,如果用户更改搜索栏的值并且在他打开导航抽屉并单击主页并返回设置片段后搜索栏回到 0"

如何在更改片段之前保持 seekBar 的状态。

这是在片段中创建视图时的代码,我认为问题是因为我膨胀了视图。

我尝试 saveInstanceState,但我认为实例永远不会被破坏,这就是为什么当我运行代码时 saveInstanceState 永远不会被调用。

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

这是我更改片段时的代码。

 navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.home_id:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container, new AcceuilFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Acceuil");
                    item.setChecked(true);
                    drawerLayout.closeDrawers();
                    break;

                case R.id.setting_id:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container, new ParamFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Paramètres");
                    item.setChecked(true);
                    drawerLayout.closeDrawers();

                    break;
                case R.id.about_id:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container, new ProposFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("À propos");
                    item.setChecked(true);
                    drawerLayout.closeDrawers();
                    break;
                case R.id.help_id:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container, new AideFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Aide");
                    item.setChecked(true);
                    drawerLayout.closeDrawers();
                    break;
            }

谢谢。


好的,我找到了解决方案,终于很容易了。

private static int disPosiVal;
private static int disCarteVal;
private static int minPosiVal;
//Pour afficher la valeur des SeekBar.
public void seekbarAffValeur(){
    skbDisPosiValu = (SeekBar)   myFragmentView.findViewById(R.id.skbDisPosi);
    tvDisPosi = (TextView) myFragmentView.findViewById(R.id.tvValeurDisPosi);
    skbDisCarteValu = (SeekBar)   myFragmentView.findViewById(R.id.skbDisCarte);
    tvDisCarte = (TextView) myFragmentView.findViewById(R.id.tvValeurDisCarte);
    skbMinuValue = (SeekBar)   myFragmentView.findViewById(R.id.skbMinPosi);
    tvMinuValu = (TextView) myFragmentView.findViewById(R.id.tvValeurMinPosio);

    skbDisPosiValu.setProgress(disPosiVal);
    tvDisPosi.setText(disPosiVal+ "");
    skbDisCarteValu.setProgress(disCarteVal);
    tvDisCarte.setText(disCarteVal+"");
    skbMinuValue.setProgress(minPosiVal);
    tvMinuValu.setText(minPosiVal+"");

    skbDisPosiValu.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            disPosiVal = progress;
            tvDisPosi.setText(progress + "");
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            tvDisPosi.setText(disPosiVal + "");

        }

    });
    skbDisCarteValu.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            disCarteVal = progress;
            tvDisCarte.setText(progress + "");
        }
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            tvDisCarte.setText(disCarteVal + "");
        }
    });
    skbMinuValue.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            minPosiVal = progress;
            tvMinuValu.setText(progress + "");
        }
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            tvMinuValu.setText(minPosiVal + "");
        }
    });

视图是销毁的,但不是片段(我认为),所以我只是将我的值保存在一个静态变量中,并在创建视图时设置它所属的值。

【问题讨论】:

  • 你在哪里设置搜索栏值?如果您在更改显示片段的位置发布代码也会很有帮助。
  • 当用户改变seekBar的进度时设置该值。我编辑我的答案更清楚。今晚晚些时候我会在更改片段时添加代码,谢谢。
  • 你试过我下面的解决方案了吗?
  • 当我将搜索栏的值存储在变量中时,它现在还没有工作。视图是删除而不是片段,因此片段保留变量值,我只是在调用 OnViewCreated 时将其放回原处。不过这周我会试试的。
  • 最后我用了这个link。我尝试了您的解决方案,但无法成功。

标签: android android-fragments android-inflate


【解决方案1】:

我认为这是问题所在 - fragmentTransaction.replace(R.id.main_container, new AcceuilFragment());

您基本上是在删除旧片段。你需要做的是

fragmentTransaction.replace(R.id.main_container, new AcceuilFragment().addToBackStack(null).commit();

addToBackStack() 基本上将片段放入堆栈。所以你可以调用 popBackStack() 来获取片段。enter code here

文档:

FragmentManager popBackStack

FragmentTransaction addToBackStack

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多