不同类/方法之间的意图



我想向 InformationActivity 发送 2 个不同的值。
首先:我想发送条形码编号和列表(工作正常(。但是由于某种原因,我发送的列表(小麦或熟或鸡蛋,取决于我按下的内容(没有出现在信息活动中。
我认为问题在于它在两个不同的类中。

如何更改代码,以便将条形码字符串和其中一个列表发送到下一个活动中?

附言。我尝试将意图声明为全局变量,但导致应用程序崩溃PSS。目前我只是通过在该数组中打印 i 项目来测试它。

主要:

public class HomeActivity extends AppCompatActivity{
private FirebaseAuth firebaseAuth;
private Button buttonLogout;
private ZXingScannerView scannerView;
private final int permission_code = 1;
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();
    //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(new AdapterView.OnItemSelectedListener() {
        @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();
            Intent intent = new Intent(getApplicationContext(), InformationActivity.class);
            switch (position){
                case 0:
                    String[] wheat = getResources().getStringArray(R.array.Wheat);
                    intent.putExtra("Profile", wheat);
                    break;
                case 1:
                    String[] crus = getResources().getStringArray(R.array.Crustaceans);
                    intent.putExtra("Profile", crus);
                    break;
                case 2:
                    String[] eggs = getResources().getStringArray(R.array.Eggs);
                    intent.putExtra("Profile", eggs);
                    break;
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            return;
        }
    });
}

//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();
}
//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("barcode", resultBarcode.toString());
        startActivity(intent);
        scannerView.stopCamera();
    }
}

信息活动:

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("barcode"));
    TextView profileView = (TextView) findViewById(R.id.tvProfile);
    String[] Profile = getIntent().getStringArrayExtra("Profile");
    profileView.setText(Profile[1]);

}

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

您的onItemSelected()方法是向Intent对象添加String[],但随后只是将其Intent扔掉。

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    ...
    Intent intent = new Intent(getApplicationContext(), InformationActivity.class);
    switch (position){
        case 0:
            String[] wheat = getResources().getStringArray(R.array.Wheat);
            intent.putExtra("Profile", wheat);
            break;
        case 1:
            String[] crus = getResources().getStringArray(R.array.Crustaceans);
            intent.putExtra("Profile", crus);
            break;
        case 2:
            String[] eggs = getResources().getStringArray(R.array.Eggs);
            intent.putExtra("Profile", eggs);
            break;
    }
}

稍后,您使用不同的Intent启动活动:

@Override
public void handleResult(Result result) {
    String resultBarcode = result.getText();
    Intent intent = new Intent(getApplicationContext(), InformationActivity.class);
    intent.putExtra("barcode", resultBarcode.toString());
    startActivity(intent);
    scannerView.stopCamera();
}

重要的是要明白,这两个意图并不以某种方式共享;第一个与第二个完全分开,一旦onItemSelected()完成执行,意图就会被抛弃。

您应该做的是更改onItemSelected()方法,以便它以某种方式存储有关选择的信息(可能会更新活动中的变量(,然后更改handleResult()方法以读取保存的信息并将数组添加到 Intent。也许是这样的:

String[] selectedArray;
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    ...
    switch (position){
        case 0:
            selectedArray = getResources().getStringArray(R.array.Wheat);
            break;
        case 1:
            selectedArray = getResources().getStringArray(R.array.Crustaceans);
            break;
        case 2:
            selectedArray = getResources().getStringArray(R.array.Eggs);
            break;
    }
}
@Override
public void handleResult(Result result) {
    String resultBarcode = result.getText();
    Intent intent = new Intent(getApplicationContext(), InformationActivity.class);
    intent.putExtra("barcode", resultBarcode.toString());
    intent.putExtra("Profile", selectedArray);
    startActivity(intent);
    scannerView.stopCamera();
}

我认为您应该使用 startActivityForResult(( 来更好地管理活动之间的信息交换,并构建一个更可靠的应用程序。

你需要调用scanBarcode((函数来触发意图,并使用Ben提供的完美解决方案启动InformationActivity:

String[] selectedArray;
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    ...
    switch (position){
        case 0:
            selectedArray = getResources().getStringArray(R.array.name);
            break;
        case 1:
            selectedArray = getResources().getStringArray(R.array.name);
            break;
    }
}

也只需调用 finish((; 函数在 InformationActivity 的 onBackPressed(( 中导航到 Mainactivity:

    @Override
public void onBackPressed() {
    super.finish(); // or use super.onBackPressed(); 
}

快乐编码:)

最新更新