拍照后 Viewpager 捕捉到错误的页面
Viewpager snaps to the wrong page after taking a photo
我目前在我的 android 应用程序中使用 Viewpager 实现。在每个片段中,都有一个 按钮 可以拍照并将其上传到在线数据库。但是,由于新的权限要求,我需要请求许可。因此,我需要使用 onRequestPermissionsResult() 来继续上传。
下面是我的实现
这是来自ViewPager.class(因为在授予权限后,Viewpager中的这个方法被调用而不是片段中的那个)
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_TAKE_PHOTO:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Permission granted to write and read file
//Get the current fragment
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for (Fragment currFragment : fragments) {
if (currFragment != null)
currFragment.onRequestPermissionsResult(
REQUEST_TAKE_PHOTO
, permissions
, grantResults);
}
}
return;
default: //Do nothing
return;
}
}
这是来自片段本身
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_TAKE_PHOTO:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Permission granted to write and read file
uploadImage();
}
return;
default: //Do nothing
return;
}
}
这部分
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for (Fragment currFragment : fragments) {
if (currFragment != null)
currFragment.onRequestPermissionsResult(
REQUEST_TAKE_PHOTO
, permissions
, grantResults);
}
是我试图找到 正确的片段 单击按钮并调用 OnRequestPermissionResult() 方法。
但是,我从 Viewpager 注意到了这种奇怪的行为。我实现它的方式是从 RecyclerView 单击 Viewholder,然后进入 ViewPager 中的那个位置。
奇怪的行为是,例如,我从 RecyclerView 进入第 2 页。然后我滑动到第4页并点击上传照片按钮,照片完成后(通过内置相机应用程序),它会切换回第2页
这是为什么?我如何解决它?抱歉,冗长 post。只是想从那里获取尽可能多的信息。谢谢
编辑:这就是我调用 requestPermission
的方式
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_TAKE_PHOTO) {
//Request for permission to access file
if (ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//ask for permission
ActivityCompat.requestPermissions(getActivity(), new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_TAKE_PHOTO);
} else {
uploadImage();
}
}
}
有什么问题吗?
编辑 Post:这是我调用 notifyDataSetChange()
的部分
private void loadData() {
mRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ArrayList<RouteInstructions> mList2 = new ArrayList<RouteInstructions>();
for (DataSnapshot instructions : dataSnapshot.getChildren()) {
mList2.add(instructions.getValue(RouteInstructions.class));
}
mList = mList2;
mAdapter.notifyDataSetChanged();
mPager.setCurrentItem(getIntent().getIntExtra(EXTRA_INDEX, 0));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
我发现了错误。基本上,我错误地将 loadData() 方法放在 onResume() 方法中,因此将 Viewpager 页面设置回从 Extra 获得的页面。
我目前在我的 android 应用程序中使用 Viewpager 实现。在每个片段中,都有一个 按钮 可以拍照并将其上传到在线数据库。但是,由于新的权限要求,我需要请求许可。因此,我需要使用 onRequestPermissionsResult() 来继续上传。
下面是我的实现
这是来自ViewPager.class(因为在授予权限后,Viewpager中的这个方法被调用而不是片段中的那个)
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_TAKE_PHOTO:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Permission granted to write and read file
//Get the current fragment
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for (Fragment currFragment : fragments) {
if (currFragment != null)
currFragment.onRequestPermissionsResult(
REQUEST_TAKE_PHOTO
, permissions
, grantResults);
}
}
return;
default: //Do nothing
return;
}
}
这是来自片段本身
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_TAKE_PHOTO:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Permission granted to write and read file
uploadImage();
}
return;
default: //Do nothing
return;
}
}
这部分
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for (Fragment currFragment : fragments) {
if (currFragment != null)
currFragment.onRequestPermissionsResult(
REQUEST_TAKE_PHOTO
, permissions
, grantResults);
}
是我试图找到 正确的片段 单击按钮并调用 OnRequestPermissionResult() 方法。
但是,我从 Viewpager 注意到了这种奇怪的行为。我实现它的方式是从 RecyclerView 单击 Viewholder,然后进入 ViewPager 中的那个位置。
奇怪的行为是,例如,我从 RecyclerView 进入第 2 页。然后我滑动到第4页并点击上传照片按钮,照片完成后(通过内置相机应用程序),它会切换回第2页
这是为什么?我如何解决它?抱歉,冗长 post。只是想从那里获取尽可能多的信息。谢谢
编辑:这就是我调用 requestPermission
的方式@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_TAKE_PHOTO) {
//Request for permission to access file
if (ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//ask for permission
ActivityCompat.requestPermissions(getActivity(), new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_TAKE_PHOTO);
} else {
uploadImage();
}
}
}
有什么问题吗?
编辑 Post:这是我调用 notifyDataSetChange()
的部分private void loadData() {
mRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ArrayList<RouteInstructions> mList2 = new ArrayList<RouteInstructions>();
for (DataSnapshot instructions : dataSnapshot.getChildren()) {
mList2.add(instructions.getValue(RouteInstructions.class));
}
mList = mList2;
mAdapter.notifyDataSetChanged();
mPager.setCurrentItem(getIntent().getIntExtra(EXTRA_INDEX, 0));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
我发现了错误。基本上,我错误地将 loadData() 方法放在 onResume() 方法中,因此将 Viewpager 页面设置回从 Extra 获得的页面。