- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用带有两个 fragment 的 ViewPager:PhotoFragment 和 GalleryFragment。
如果我滑动到第二个 fragment (GalleryFragment),我总是想重新创建那个 fragment 。
但是,当我滑回第一个 fragment (PhotoFragment) 时,我希望将其从内存中拉出。
我试图实现这个问题的解决方案 Update ViewPager dynamically?
我利用 notifyDataSetChanged()
并覆盖了 getItemPosition()
以在滑动到第二个 fragment 时返回 POSITION_NONE。
当我滑动到第二个 fragment 时,它会被正确地重新创建。但是当我滑回第一个 fragment 时,我注意到它也被重新创建了。
我想返回 POSITION_NONE 会导致适配器中所有 fragment 的删除和重新创建。我是一名 Android 开发新手,不知道如何只重新创建第二个 fragment 。
带有 ViewPager 的 MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ViewPager viewPager = findViewById(R.id.viewpager);
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
}
@Override
public void onPageSelected(int i) {
if (i == 1) {
viewPager.getAdapter().notifyDataSetChanged();
}
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
TabLayout tabLayout = findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
}
适配器:
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 2;
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
return new PhotoFragment();
case 1:
return new GalleryFragment();
default:
return null;
}
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Photo";
case 1:
return "Gallery";
default:
return null;
}
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
照片 fragment :
public class PhotoFragment extends Fragment {
private static final int CAMERA_REQUEST_CODE = 0;
private static final int GALLERY_REQUEST_CODE = 1;
private ImageView mCapturedImageView;
private String mCacheFileLocation;
private File mCacheFolder;
private File mGalleryFolder;
private String mImageFileLocation;
private TextView mMonthText;
private FrameLayout stickerFrameLayout;
private static final String TAG = "PhotoFragment";
public PhotoFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_photo, container, false);
mMonthText = rootView.findViewById(R.id.monthText);
mCapturedImageView = rootView.findViewById(R.id.capturedImageView);
ImageButton mCameraButton = rootView.findViewById(R.id.cameraButton);
ImageButton mSaveButton = rootView.findViewById(R.id.saveButton);
stickerFrameLayout = rootView.findViewById(R.id.stickerFrameLayout);
ImageButton mRainbowButton = rootView.findViewById(R.id.buttonRainbow);
ImageButton mDancerButton = rootView.findViewById(R.id.buttonDancer);
ImageButton mGlassesButton = rootView.findViewById(R.id.buttonGlasses);
ImageButton mHeartButton = rootView.findViewById(R.id.buttonHeart);
ImageButton mCrownButton = rootView.findViewById(R.id.buttonCrown);
ImageButton mJorisButton = rootView.findViewById(R.id.buttonJoris);
mMonthText.setVisibility(View.INVISIBLE);
createImageFolders();
View.OnClickListener stickerListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
addSticker(v.getId());
}
};
mRainbowButton.setOnClickListener(stickerListener);
mDancerButton.setOnClickListener(stickerListener);
mGlassesButton.setOnClickListener(stickerListener);
mHeartButton.setOnClickListener(stickerListener);
mCrownButton.setOnClickListener(stickerListener);
mJorisButton.setOnClickListener(stickerListener);
mCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPictureDialog();
}
});
mSaveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveImage();
}
});
return rootView;
}
private void showPictureDialog() {
AlertDialog.Builder pictureDialog = new AlertDialog.Builder(getActivity());
pictureDialog.setTitle("Select Action");
String[] pictureDialogItems = {"Select photo from device", "Capture photo with camera"};
pictureDialog.setItems(pictureDialogItems, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
pickImage();
break;
case 1:
takePhoto();
break;
}
}
});
pictureDialog.show();
}
private void pickImage() {
Intent pickImageIntent = new Intent(Intent.ACTION_PICK);
pickImageIntent.setType("image/*");
String[] mimeTypes = {"image/jpeg", "image/png"};
pickImageIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
pickImageIntent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
startActivityForResult(pickImageIntent, GALLERY_REQUEST_CODE);
mMonthText.setVisibility(View.INVISIBLE);
}
private void takePhoto() {
Intent callCameraApplicationIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (callCameraApplicationIntent.resolveActivity(getActivity().getPackageManager()) != null) {
File file = null;
try {
file = createCacheFile();
} catch (IOException e) {
e.printStackTrace();
}
if (file != null) {
Uri photoURI = FileProvider.getUriForFile(getActivity(), "com.jorisvanlaar.employeeofthemonth.fileprovider", file);
callCameraApplicationIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(callCameraApplicationIntent, CAMERA_REQUEST_CODE);
mMonthText.setVisibility(View.INVISIBLE);
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == getActivity().RESULT_OK) {
switch (requestCode) {
case GALLERY_REQUEST_CODE:
Bitmap bitmap = null;
if (data.getData() != null) {
try {
bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(data.getData()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
try {
writeBitmapToFile(bitmap, createCacheFile());
} catch (IOException e) {
e.printStackTrace();
}
rotateImage(reduceImageSize());
break;
case CAMERA_REQUEST_CODE:
rotateImage(reduceImageSize());
break;
}
}
}
private void createImageFolders() {
File storageDirectory = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
mCacheFolder = new File(storageDirectory, "cached files");
if (!mCacheFolder.exists()) {
mCacheFolder.mkdirs();
}
mGalleryFolder = new File(storageDirectory, "Image Gallery");
if (!mGalleryFolder.exists()) {
mGalleryFolder.mkdirs();
}
}
@SuppressLint("SimpleDateFormat")
private File createCacheFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String cacheFileName = "IMG_" + timeStamp + "_";
File image = File.createTempFile(cacheFileName, ".jpg", mCacheFolder);
mCacheFileLocation = image.getAbsolutePath();
return image;
}
@SuppressLint("SimpleDateFormat")
private File createImageFile() {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "EMPL_" + timeStamp + "_.jpg";
File image = new File(mGalleryFolder, imageFileName);
mImageFileLocation = image.getAbsolutePath();
return image;
}
private void writeBitmapToFile(Bitmap bitmap, File destination) {
FileOutputStream out = null;
try {
out = new FileOutputStream(destination);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
} catch (Exception ex) {
Log.i(TAG, "Error writing bitmap to file");
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
private Bitmap reduceImageSize() {
int targetImageViewWidth = mCapturedImageView.getWidth();
int targetImageViewHeight = mCapturedImageView.getHeight();
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCacheFileLocation, bmOptions);
int cameraImageWidth = bmOptions.outWidth;
int cameraImageHeight = bmOptions.outHeight;
int scaleFactor = Math.min(cameraImageWidth / targetImageViewWidth, cameraImageHeight / targetImageViewHeight);
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
Bitmap photoReducedSizeBitmap = BitmapFactory.decodeFile(mCacheFileLocation, bmOptions);
return photoReducedSizeBitmap;
}
private void rotateImage(Bitmap bitmap) {
ExifInterface exifInterface = null;
try {
exifInterface = new ExifInterface(mCacheFileLocation);
} catch (IOException e) {
e.printStackTrace();
}
int orientation = 0;
if (exifInterface != null) {
orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
}
Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.setRotate(90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.setRotate(180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.setRotate(270);
break;
default:
}
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
mCapturedImageView.setImageBitmap(rotatedBitmap);
}
@SuppressLint("SetTextI18n")
private void saveImage() {
Calendar calendar = Calendar.getInstance();
int currentMonth = calendar.get(Calendar.MONTH);
MonthCollection monthCollection = new MonthCollection();
mMonthText.setText("Employee of " + monthCollection.getMonth(currentMonth));
mMonthText.setVisibility(View.VISIBLE);
Bitmap bitmap = Bitmap.createBitmap(stickerFrameLayout.getWidth(), stickerFrameLayout.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
stickerFrameLayout.draw(canvas);
writeBitmapToFile(bitmap, createImageFile());
Toast.makeText(getActivity(), "Image saved!", Toast.LENGTH_SHORT).show();
}
private void addSticker(int id) {
StickerImageView sticker = new StickerImageView(getActivity());
switch (id) {
case R.id.buttonRainbow:
sticker.setImageDrawable(getResources().getDrawable(R.drawable.sticker_rainbow));
break;
case R.id.buttonDancer:
sticker.setImageDrawable(getResources().getDrawable(R.drawable.sticker_dancer));
break;
case R.id.buttonGlasses:
sticker.setImageDrawable(getResources().getDrawable(R.drawable.sticker_sunglasses));
break;
case R.id.buttonHeart:
sticker.setImageDrawable(getResources().getDrawable(R.drawable.sticker_heart));
break;
case R.id.buttonCrown:
sticker.setImageDrawable(getResources().getDrawable(R.drawable.sticker_crown));
break;
case R.id.buttonJoris:
sticker.setImageDrawable(getResources().getDrawable(R.drawable.sticker_joris));
break;
default:
throw new RuntimeException("Unknown button ID");
}
stickerFrameLayout.addView(sticker);
}
}
画廊 fragment :
public class GalleryFragment extends Fragment {
private RecyclerView mRecyclerView;
private File mGalleryFolder;
private static int mColumnCount = 3;
private static int mImageWidth;
private static int mImageHeight;
public GalleryFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_gallery, container, false);
mRecyclerView = rootView.findViewById(R.id.galleryRecyclerView);
mGalleryFolder = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES + "/Image Gallery");
DisplayMetrics displayMetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
mImageWidth = displayMetrics.widthPixels / mColumnCount;
mImageHeight = mImageWidth * 4 / 3;
GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), mColumnCount);
mRecyclerView.setLayoutManager(layoutManager);
File[] sortedGalleryFolder = sortFilesToLatest(mGalleryFolder);
RecyclerView.Adapter imageAdapter = new ImageAdapter(sortedGalleryFolder, mImageWidth, mImageHeight);
mRecyclerView.setAdapter(imageAdapter);
return rootView;
}
private File[] sortFilesToLatest(File imageDirectory) {
File[] files = imageDirectory.listFiles();
Arrays.sort(files, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
return Long.valueOf(o2.lastModified()).compareTo(o1.lastModified());
}
});
return files;
}
}
最佳答案
重新创建第一个 fragment 是因为当您调用 notifyDataSetChanged()
时它会影响两个 fragment ,而不仅仅是 i == 1
fragment
根据你目前的状态解决方案是这样的
@Override
public int getItemPosition(@NonNull Object object) {
if (object instanceof PhotoFragment) {
return POSITION_UNCHANGED;
}
return POSITION_NONE;
}
但是这不是最佳选择,因为滚动缓慢,您可以尝试使用子 fragment 来实现您想要的
关于安卓ViewPager : recreate single specific fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56430922/
在下面的方法中,如何将第一个Single的结果传递给第二个Single? 如现在所写,当它返回时,somethingId 是空的。如果我将返回的 Single.just(somethingId) 中的
我发现很多帖子都在回答类似的问题(例如“如何用 / 替换 \”或“如何替换 \\” by \”。我理解所有这些,但没有一个能解决我的特殊问题。这里是: 我正在从注册表中读取路径字符串,其中包含“///
注意:事实证明,toCompletable() 并非错误,而是调用代码。调用代码使得更改此方法使其工作(或不工作)。 我有以下方法。它返回一个 Single。有用。执行内部代码,以便 remoteDa
react-native repo here 中的一个文件中有一段代码如下图: export type Operation = & {instanceID: DebugID} & (
当使用带有 Single() 的 LINQ 时,我的代码行总是带有绿色下划线,并带有建议“替换为对 single 的单一调用”。这是什么意思?下面是产生该建议的一行代码示例: var user = d
讨论来自 this answer让我好奇。哪个更快: someEnumerable.Single(predicate); 或 someEnumerable.Where(predicate).Singl
我正在使用 Keycloak 作为单点登录 (SSO) 平台的 OP。我已经将我的两个 Web 应用程序连接到 Keycloak,以便使用单点登录功能。 此外,我已经制作了一个应用程序,当注销时将被重
我的步骤是: 创建单个值 x - 可能会占用一些 CPU 资源 使用值x来执行IO操作。这已经返回 Completable 返回x 所以我想这样做: Single result =
我想知道是否有人可以阐明这个问题,什么时候使用 Single.fromCallable( ()-> myObject ) 代替 Single.just(myObject) 根据文档,Single.fr
我有两个 Singles 来源,我将它们组合成一个 Single of Pair。 假设我们对这些来源有两种方法: private Single single1() {} private Single
我想将单个 Intel CPU 内核的速度与单个 nVidia GPU 内核的速度(即:单个 CUDA 代码、单个线程)进行比较。我确实实现了以下简单的二维图像卷积算法: void convoluti
我在实现 Ping Federate 时遇到此问题 Error - Single Sign-On Single sign-on authentication was unsuccessful (ref
我有几个 api 调用(Rx singles),我想将它们组合成一个 Single。我正在使用 Single.merge 尝试合并这些调用的结果,但是当我订阅响应时,我得到一个空数组,因为订阅已经发生
早上好。我的代码有问题 bootsfaces 。我需要我的 DataTable 支持单行选择,但不支持多行选择。但是,我的表格始终只使用多项选择。 这是我的代码: 我没有进行简单的选择,因为我引用了
我怎样才能像下面的代码那样使用字符串。 $str = 'Is yo"ur name O'reil"ly?'; 上面的代码只是一个例子..我需要使用包含单引号和双引号的大 html 模板。我尝试了 Ad
我有一组地理空间+时间数据和一些附加属性,我将在 map 上显示这些数据。该集合目前有几百万份文件,并且会随着时间的推移而增加。 每个文档都有以下字段: 位置:[geojson 对象] 日期:[日期对
我目前在 .NET 2.0 下使用 SharpZipLib,通过它我需要将单个文件压缩为单个压缩存档。为此,我目前正在使用以下内容: string tempFilePath = @"C:\Users\
我有 table create table1( column1 number(10, column2 number(10), column3 number(10) ); column1是主
考虑下面这段代码,我正在尝试使用 Executors.newFixedThreadPool(1).asCoroutineDispatcher()创建单线程调度程序;我想要 launch(singleT
我面临着困惑,举个例子 4 Single: val s1 : Single = service1.execute().subscribeOn(io()) val s2 : Single = servi
我是一名优秀的程序员,十分优秀!