我想向 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();
}
快乐编码:)