【问题标题】:trying to save and restore instances尝试保存和恢复实例
【发布时间】:2018-09-03 02:40:06
【问题描述】:

我目前正试图从微调器中获取选定的值,保存它,然后当实例恢复时(在应用程序关闭后),该值将插入到我拖到布局上的 TextView 中。

不管怎样,下面是我目前的代码

 TextView example;
    private String someVarB;
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        String values = spinner.getSelectedItem().toString(); //gets the values from the spinner to the variable values

        outState.putString(values, someVarB); //saves the v alues to the variable someVarB, which will be called when restored.
    }


    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        someVarB = savedInstanceState.getString("someVarB");
        example.setTextSize(someVarB);
        //try setting the variable to an textview which you will put on manually on the xml.
    }

但是我遇到了一个问题。

'无法解析符号微调器'。 spinner 是在我的代码中创建的微调器的变量名,它们是在 private 方法中创建的。我该怎么做才能在代码中的任何其他位置调用这个 spinner 变量?

工厂代码

floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getBaseContext(), "Item added!", Toast.LENGTH_SHORT).show();
                spinner = findViewById(R.id.spinner);



                // Handle ze click.
                final Spinner spinner = makeSpinner();
                mLinearLayout.addView(spinner);


                LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) spinner.getLayoutParams();
                layoutParams.setMargins(5, 100, 10, 0); //top 70

                Resources resources = getResources();
                DisplayMetrics metrics = resources.getDisplayMetrics();

                layoutParams.height = (int) (70 * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT)); //80
                layoutParams.width = (int) (240 * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT)); //240
                spinner.setLayoutParams(layoutParams);

                final View newView = makeView();
                //Add a new view
                mLinearLayout.addView(newView);
                mViews.add(newView);


                final EditText newEdittext = makeEdittext();
                mLinearLayout.addView(newEdittext);
                mEdittexts.add(newEdittext);


                final int listSize = mViews.size();


                //code for deleting the said item.
                newView.setOnClickListener(new View.OnClickListener() {
                    //start
                    @Override
                    public void onClick(View view) {

                        //when the 'new button' is pressed, alert shows if you are sure you want to delete the item or not.

                        final View.OnClickListener context = this;


                        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(create.this);


                        // set title
                        alertDialogBuilder.setTitle("Delete Item");

                        // set dialog message
                        alertDialogBuilder
                                .setMessage("Are you sure you want to delete this item?")
                                .setCancelable(false)
                                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        // if this button is clicked, close
                                        // current activity


                                        if (listSize > 0) {

                                            mCheckboxes.get(listSize - 1).setVisibility(View.GONE);
                                            mSpinners.get(listSize - 1).setVisibility(View.GONE);
                                            mViews.get(listSize - 1).setVisibility(View.GONE);
                                            mTextviews.get(listSize - 1).setVisibility(View.GONE);
                                            mEdittexts.get(listSize - 1).setVisibility(View.GONE);
                                            Toast.makeText(getBaseContext(), "Item removed.", Toast.LENGTH_SHORT).show();

                                        }


                                    }
                                })
                                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        // if this button is clicked, just close
                                        // the dialog box and do nothing
                                        dialog.cancel();
                                    }
                                });

                        // create alert dialog
                        AlertDialog alertDialog = alertDialogBuilder.create();

                        // show it
                        alertDialog.show();


                    }
                });


                //Add a new checkbox
                final CheckBox newCheckbox = makeCheckbox();
                mLinearLayout.addView(newCheckbox);

                //TODO add checkbox to your list
                mCheckboxes.add(newCheckbox);


                final TextView newTextview = makeTextview();
                mLinearLayout.addView(newTextview);
                mTextviews.add(newTextview);

                //TODO Add the spinner on item selected listener to get selected items
                spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
                        String currentItem = itemList.get(position);
                        String aisleNumber = numberItemValues.get(currentItem);
                        //TODO you can use the above aisle number to add to your text view
                        //mTextviews.get(mTextviews.size() -1).setText(aisleNumber);
                        newTextview.setText(aisleNumber);
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parentView) {
                        //  code here
                    }

                });


            }
        });

【问题讨论】:

  • 如果你想在应用重启等事件中保留状态,我认为你应该使用共享首选项或某种本地/远程数据库,例如SQLite。

标签: android


【解决方案1】:

解决方案:

如果您遇到“无法解析符号微调器”之类的错误...您必须像下面这样声明和初始化它:

private Spinner spinner;

作为全局变量然后:在你的onCreate()中,

spinner = findViewById(R.id.your_spinner_id);

在 onCreate() 中。

希望对你有帮助。

【讨论】:

  • 嗨,有道理。但是,我怎么知道我的微调器的 id 是什么?因为这些微调器不在我的 xml 中,所以我实际上是在按下 FAB 按钮时以编程方式创建它们。
  • 您需要以编程方式设置 id。在您的值文件夹中创建一个名为 ids.xml 的 xml,然后创建一个 id 项并将其称为微调器。然后在您的 FAB 中, spinner.setId(R.id.whatever_id_you_give);那么如果会工作。另外,请发布您的FAB代码
  • @Magic_Whizz 有帮助吗?
  • 谢谢,但您现在不必使用实例状态。你听说过 android 的新架构模式吗?
  • stackoverflow.com/questions/23024831/… 查看这个已接受的答案。我总是将这个用于我的任何项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2013-04-15
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
相关资源
最近更新 更多