如何在不进行其他活动的情况下在单个 activity 中添加多个 onActivityResult()?
How to add multiple onActivityResult() in a single activity without going to other activities?
我在单个 activity 中同时使用 ImagePicker 和条形码 reader。主要问题是这两者都需要 onActivityResult() 来显示结果。正如我们所知,单个 activity 中只能有一个 onActivityResult() 方法。如何同时显示它们?
我曾尝试使用 switch cases 在 onActivityResult() 中分配多个 requestCodes,但似乎无法找出解决方案。
这是我试过的方法。
public class MainActivity extends AppCompatActivity{
private TextView mIdentificationNumber;
private IntentIntegrator scanQR;
//Authentication For Firebase.
private FirebaseAuth mAuth;
//Toolbar
private Toolbar mToolBar;
private DatabaseReference mUserRef;
private ImageView mAssetImg;
private EditText massetName, massetModel, massetBarcode, massetArea, massetDescription;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Getting the Present instance of the FireBase Authentication
mAuth = FirebaseAuth.getInstance();
//Finding The Toolbar with it's unique Id.
mToolBar = (Toolbar) findViewById(R.id.main_page_toolbar);
//Setting Up the ToolBar in The ActionBar.
setSupportActionBar(mToolBar);
if (mAuth.getCurrentUser() != null){
mUserRef = FirebaseDatabase.getInstance().getReference().child("Users")
.child(mAuth.getCurrentUser().getUid());
mUserRef.keepSynced(true);
}
massetBarcode = (EditText) findViewById(R.id.BarcodeAsset);
scanQR = new IntentIntegrator(this);
massetBarcode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
scanQR.initiateScan();
}
});
mAssetImg = (ImageView) findViewById(R.id.asset_img);
mAssetImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getImage();
}
});
}
//OnStart Method is started when the Authentication Starts.
@Override
public void onStart() {
super.onStart();
// Check if user is signed in (non-null).
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser == null){
startUser();
} else {
mUserRef.child("online").setValue("true");
Log.d("STARTING THE ACTIVITY" , "TRUE");
}
}
@Override
protected void onPause() {
super.onPause();
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser != null){
mUserRef.child("online").setValue(ServerValue.TIMESTAMP);
Log.d("STOPPING THE ACTIVITY" , "TRUE");
}
}
private void startUser() {
//Sending the user in the StartActivity If the User Is Not Logged In.
Intent startIntent = new Intent(MainActivity.this , AuthenticationActivity.class);
startActivity(startIntent);
//Finishing Up The Intent So the User Can't Go Back To MainActivity Without LoggingIn.
finish();
}
//Setting The Menu Options In The AppBarLayout.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
//Inflating the Menu with the Unique R.menu.Id.
getMenuInflater().inflate(R.menu.main_menu , menu);
return true;
}
//Setting the Individual Item In The Menu.(Logout Button)
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
if (item.getItemId() == R.id.main_logout_btn){
FirebaseAuth.getInstance().signOut();
startUser();
}
return true;
}
private void getImage() {
ImagePicker.Companion.with(this)
.crop() //Crop image(Optional), Check Customization for more option
.compress(1024) //Final image size will be less than 1 MB(Optional)
.maxResultSize(1080, 1080) //Final image resolution will be less than 1080 x 1080(Optional)
.start();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 0:
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (result != null) {
if (result.getContents() == null) {
Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
} else {
massetBarcode.setText(result.getContents());
Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
}
}
break;
case 1:
if (resultCode == Activity.RESULT_OK) {
assert data != null;
Uri imageURI = data.getData();
mAssetImg.setImageURI(imageURI);
}
break;
}
}
}
其余答案告诉我们使用 startActivityForResult() 但该方法需要 Intent 从一个 activity 转到另一个,但我不想这样做。
为了将结果从片段获取到您的 Activity,您可以使用 Interface
来启用它们之间的通信。
StartActivityForResult
用于启动 activity 并从中获取结果。
请详细阅读 from here。
startActivityForResult
方法可以使用第二个参数,一个数字,这样您就可以区分结果
startActivityForResul(intent, 8)
您无需在另一个 activity 中重新设置代码,该代码已在后台处理。所以你可能想把这个数字添加为一个常数
private static final CAMERA_INTENT = 2
然后像这样使用
startActivityForResul(intent, CAMERA_INTENT)
终于在onActivityResult
实施案例基础
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
if (CAMERA_INTENT == requestCode) {
//DO PHOTO STUFF
}
}
您需要评估的参数是 requestCode
在这两种情况下,您使用的库都提供了一种指定请求代码的方法,因此您可以区分 onActivityResult
中的结果。
您的 scanQR
对象应设置请求代码,per the source code:
massetBarcode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
scanQR.setRequestCode(123).initiateScan();
}
});
您 getImage()
方法还应指定一个请求代码,同样,per the library's source code。
private void getImage() {
ImagePicker.Companion.with(this)
.crop() //Crop image(Optional), Check Customization for more option
.compress(1024) //Final image size will be less than 1 MB(Optional)
.maxResultSize(1080, 1080) //Final image resolution will be less than 1080 x 1080(Optional)
.start(456); // Start with request code
}
现在,您可以根据需要处理每个请求代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 123:
// HANDLE BARCODE
break;
case 456:
// HANDLE IMAGE
break;
}
}
结束语:我从未使用过这两个库。我找到了解决方案 1) 假设任何提供 Activity 你应该为结果调用的库将允许你为它指定一个请求代码和 2) 查看他们的文档和源代码以了解如何这样做。
我鼓励你彻底研究你打算使用的任何开源库的文档和源代码,因为一旦你这样做,他们的代码就会成为你的代码,他们的错误就会成为你的错误,所以你最好知道如何修复或解决它们。
希望对您有所帮助!
我在单个 activity 中同时使用 ImagePicker 和条形码 reader。主要问题是这两者都需要 onActivityResult() 来显示结果。正如我们所知,单个 activity 中只能有一个 onActivityResult() 方法。如何同时显示它们?
我曾尝试使用 switch cases 在 onActivityResult() 中分配多个 requestCodes,但似乎无法找出解决方案。
这是我试过的方法。
public class MainActivity extends AppCompatActivity{
private TextView mIdentificationNumber;
private IntentIntegrator scanQR;
//Authentication For Firebase.
private FirebaseAuth mAuth;
//Toolbar
private Toolbar mToolBar;
private DatabaseReference mUserRef;
private ImageView mAssetImg;
private EditText massetName, massetModel, massetBarcode, massetArea, massetDescription;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Getting the Present instance of the FireBase Authentication
mAuth = FirebaseAuth.getInstance();
//Finding The Toolbar with it's unique Id.
mToolBar = (Toolbar) findViewById(R.id.main_page_toolbar);
//Setting Up the ToolBar in The ActionBar.
setSupportActionBar(mToolBar);
if (mAuth.getCurrentUser() != null){
mUserRef = FirebaseDatabase.getInstance().getReference().child("Users")
.child(mAuth.getCurrentUser().getUid());
mUserRef.keepSynced(true);
}
massetBarcode = (EditText) findViewById(R.id.BarcodeAsset);
scanQR = new IntentIntegrator(this);
massetBarcode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
scanQR.initiateScan();
}
});
mAssetImg = (ImageView) findViewById(R.id.asset_img);
mAssetImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getImage();
}
});
}
//OnStart Method is started when the Authentication Starts.
@Override
public void onStart() {
super.onStart();
// Check if user is signed in (non-null).
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser == null){
startUser();
} else {
mUserRef.child("online").setValue("true");
Log.d("STARTING THE ACTIVITY" , "TRUE");
}
}
@Override
protected void onPause() {
super.onPause();
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser != null){
mUserRef.child("online").setValue(ServerValue.TIMESTAMP);
Log.d("STOPPING THE ACTIVITY" , "TRUE");
}
}
private void startUser() {
//Sending the user in the StartActivity If the User Is Not Logged In.
Intent startIntent = new Intent(MainActivity.this , AuthenticationActivity.class);
startActivity(startIntent);
//Finishing Up The Intent So the User Can't Go Back To MainActivity Without LoggingIn.
finish();
}
//Setting The Menu Options In The AppBarLayout.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
//Inflating the Menu with the Unique R.menu.Id.
getMenuInflater().inflate(R.menu.main_menu , menu);
return true;
}
//Setting the Individual Item In The Menu.(Logout Button)
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
if (item.getItemId() == R.id.main_logout_btn){
FirebaseAuth.getInstance().signOut();
startUser();
}
return true;
}
private void getImage() {
ImagePicker.Companion.with(this)
.crop() //Crop image(Optional), Check Customization for more option
.compress(1024) //Final image size will be less than 1 MB(Optional)
.maxResultSize(1080, 1080) //Final image resolution will be less than 1080 x 1080(Optional)
.start();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 0:
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (result != null) {
if (result.getContents() == null) {
Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
} else {
massetBarcode.setText(result.getContents());
Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
}
}
break;
case 1:
if (resultCode == Activity.RESULT_OK) {
assert data != null;
Uri imageURI = data.getData();
mAssetImg.setImageURI(imageURI);
}
break;
}
}
}
其余答案告诉我们使用 startActivityForResult() 但该方法需要 Intent 从一个 activity 转到另一个,但我不想这样做。
为了将结果从片段获取到您的 Activity,您可以使用 Interface
来启用它们之间的通信。
StartActivityForResult
用于启动 activity 并从中获取结果。
请详细阅读 from here。
startActivityForResult
方法可以使用第二个参数,一个数字,这样您就可以区分结果
startActivityForResul(intent, 8)
您无需在另一个 activity 中重新设置代码,该代码已在后台处理。所以你可能想把这个数字添加为一个常数
private static final CAMERA_INTENT = 2
然后像这样使用
startActivityForResul(intent, CAMERA_INTENT)
终于在onActivityResult
实施案例基础
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
if (CAMERA_INTENT == requestCode) {
//DO PHOTO STUFF
}
}
您需要评估的参数是 requestCode
在这两种情况下,您使用的库都提供了一种指定请求代码的方法,因此您可以区分 onActivityResult
中的结果。
您的 scanQR
对象应设置请求代码,per the source code:
massetBarcode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
scanQR.setRequestCode(123).initiateScan();
}
});
您 getImage()
方法还应指定一个请求代码,同样,per the library's source code。
private void getImage() {
ImagePicker.Companion.with(this)
.crop() //Crop image(Optional), Check Customization for more option
.compress(1024) //Final image size will be less than 1 MB(Optional)
.maxResultSize(1080, 1080) //Final image resolution will be less than 1080 x 1080(Optional)
.start(456); // Start with request code
}
现在,您可以根据需要处理每个请求代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 123:
// HANDLE BARCODE
break;
case 456:
// HANDLE IMAGE
break;
}
}
结束语:我从未使用过这两个库。我找到了解决方案 1) 假设任何提供 Activity 你应该为结果调用的库将允许你为它指定一个请求代码和 2) 查看他们的文档和源代码以了解如何这样做。
我鼓励你彻底研究你打算使用的任何开源库的文档和源代码,因为一旦你这样做,他们的代码就会成为你的代码,他们的错误就会成为你的错误,所以你最好知道如何修复或解决它们。
希望对您有所帮助!