【问题标题】:Android Save spinner state in onCreate, and Activity onResumeAndroid 在 onCreate 和 Activity onResume 中保存微调器状态
【发布时间】:2018-02-16 05:54:39
【问题描述】:

我目前面临 2 个问题,微调器状态未保存,当我在 InformationActivity 上时微调器被重置。我在其他帖子上使用过这些信息,但似乎没有帮助。

目前我不能在InformationActivity 上的onBackPressed(); 中使用finish();,因为在我实现ZXing 库时它会回到ScannerView。当我在 HomeActivity 上时,如何保存 Spinner 状态并阻止程序崩溃 onBackPressed

谢谢。

家庭活动:

public class HomeActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{

    private FirebaseAuth firebaseAuth;
    private Button buttonLogout;
    private ZXingScannerView scannerView;
    private final int permission_code = 1;

    String [] selectedProfile;

    Spinner spinner;
    ArrayAdapter<CharSequence> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        firebaseAuth = FirebaseAuth.getInstance();
        if(firebaseAuth.getCurrentUser() == null){
            finish();
            startActivity(new Intent(this, MainActivity.class));
        }
        FirebaseUser user = firebaseAuth.getCurrentUser();

        if (savedInstanceState != null) {
            spinner.setSelection(savedInstanceState.getInt("yourSpinner", 0));
            // do this for each of your text views
        }
        else {
            //android spinner to select profile
            spinner = (Spinner) findViewById(R.id.spinnerProfiles);
            adapter = ArrayAdapter.createFromResource(this, R.array.restrictions, android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_list_item_1);
            spinner.setAdapter(adapter);
            spinner.setOnItemSelectedListener(this);
        }

    }


    //opens camera when button is pressed
    public void scanBarcode(View view) {
        //check if user given app camera permissions
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, permission_code);

        }
        //opens camera
        scannerView = new ZXingScannerView(this);
        scannerView.setResultHandler(new ZXingScannerResultHandler());
        //stops camera and scannerview
        setContentView(scannerView);
        scannerView.startCamera();

    }

    //selects an item from the spinner and passes it to InformationActivity
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        String item = parent.getItemAtPosition(position).toString();
        Toast.makeText(getBaseContext(), item + " Selected", Toast.LENGTH_SHORT).show();
        switch (position){
            case 0:
                selectedProfile = getResources().getStringArray(R.array.Wheat);
                break;
            case 1:
                selectedProfile = getResources().getStringArray(R.array.Crustaceans);
                break;
            case 2:
                selectedProfile = getResources().getStringArray(R.array.Eggs);
                break;

        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }


    //stops camera and outputs barcode result to a Toast
    class ZXingScannerResultHandler implements ZXingScannerView.ResultHandler {
        @Override
        public void handleResult(Result result) {
            String resultBarcode = result.getText();
            Intent intent = new Intent(getApplicationContext(), InformationActivity.class);
            intent.putExtra("BarcodeString", resultBarcode.toString());
            intent.putExtra("ProfileArray", selectedProfile);
            startActivity(intent);
            scannerView.stopCamera();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == permission_code) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "Permission Granted", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "Permission Denied", Toast.LENGTH_LONG).show();
            }

        }
        //go back to home after permissions accepted
        Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
        startActivity(intent);
        scannerView.stopCamera();
    }


    //goes back to homepage when back button is pressed
    @Override
    public void onBackPressed() {
        setContentView(R.layout.activity_home);
        scannerView.stopCamera();
    }

    //stops the camera on pause
    @Override
    public void onPause(){
        super.onPause();
        scannerView.stopCamera();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("yourSpinner", spinner.getSelectedItemPosition());
    }

}

信息活动:

public class InformationActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_information);

        TextView barcodeView = (TextView) findViewById(R.id.tvBarcode);
        barcodeView.setText(getIntent().getExtras().getString("BarcodeString"));

        TextView profileView = (TextView) findViewById(R.id.tvProfile);
        String[] selectedProfile = getIntent().getStringArrayExtra("ProfileArray");
        profileView.setText(selectedProfile[0]);


    }


    @Override
    public void onBackPressed() {
        Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
        startActivity(intent);
    }
}

【问题讨论】:

  • 请提供崩溃日志
  • java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法 'void me.dm7.barcodescanner.zxing.ZXingScannerView.stopCamera()'
  • 这里的问题是 ScannerView 和 HomeActivity 是同一个 Activity 所以当相机关闭并且我按下它时它会关闭一个空对象,我该如何解决这个问题?
  • scanBarcode() 从哪里触发?如果未触发 scanBarcode,则scannerView 将为空并因此崩溃。
  • 我明白了,你知道我在打开和关闭活动时如何保存微调器的实例状态吗?

标签: java android spinner adapter zxing


【解决方案1】:

在 sharedpreference 中保存 Spinner 位置:

int userChoice = spinner.getSelectedItemPosition();
SharedPreferences sharedPref = getSharedPreferences("FileName",0);
SharedPreferences.Editor prefEditor = sharedPref.edit();
prefEditor.putInt("userChoiceSpinner",usersChoice);
prefEditor.commit();

从 sharedpreferences 中获取数据:

SharedPreferences sharedPref = getSharedPreferences("FileName",MODE_PRIVATE);
int spinnerValue = sharedPref.getInt("userChoiceSpinner",-1);
if(spinnerValue != -1) {
  // set the selected value of the spinner 
  spinner.setSelection(spinnerValue);
}

也看看这个:

另一个要保存的示例:https://stackoverflow.com/a/29527936/8448886

SharedPreference 教程:https://www.journaldev.com/9412/android-shared-preferences-example-tutorial

【讨论】:

  • 你能告诉我在哪里输入该代码吗,因为我目前的解决方案不起作用:(
  • 你在哪里选择 Spinner 把保存代码放在那里和 onResume 里面放 GetData from sharedpreference。
  • 这很有效,谢谢,我还有一个问题......当我在 HomeActivity 上并且我按下 Spinner 时,它会消失,因为它在 onCreate 方法中,有什么办法可以解决这个问题?
  • 欢迎您,@KyrilKhaltesky,很高兴为您提供帮助,对不起,我没有收到您的第二个问题。
  • 你想保存扫描结果吗@KyrilKhaltesky
【解决方案2】:

当您当时从微调器中选择任何项目时,获取该选定项目并存储该位置,然后当您首先返回活动加载微调器时,将该项目与数组项目进行比较并获取该项目的位置,然后将该位置设置为微调器我认为这样你就可以准确地选择该项目到微调器中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多