Как @MikeM. предложено в комментарии
Ну, есть несколько разных способов сделать это. Предполагая, что articleShareBtn находится на каждой отдельной странице, возможно, самым простым будет articleShareBtn.setTag (rootView) после строки rootView = ..., затем измените свой метод на частный Bitmap takeScreenshot (View root) {root.setDrawingCacheEnabled (true); ...}, а внутри onClick () вы бы назвали его как Bitmap screenshotBitmap = takeScreenshot ((View) view.getTag ()) ;. Подписывайтесь на меня? В противном случае, вы можете сохранить карту всех просмотров страниц и использовать текущий индекс, чтобы получить правильный. При необходимости есть несколько других способов.
Я получил это работает. Мой обновленный код адаптера
public class ArticleAdapter extends PagerAdapter {
public List<Articles> articlesListChild;
private LayoutInflater inflater;
Context context;
View rootView;
public ArticleAdapter(Context context) {
super();
this.context = context;
}
@Override
public int getCount() {
return articlesListChild.size();
}
@Override
public void destroyItem(View collection, int position, Object view) {
((ViewPager) collection).removeView((View) view);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@SuppressLint("ClickableViewAccessibility")
@Override
public Object instantiateItem(ViewGroup container, final int position) {
inflater = LayoutInflater.from(container.getContext());
View viewLayout = inflater.inflate(R.layout.article_single_item, null, false);
final ImageView contentIv, imageContentIv;
TextView contentHeadTv, contentBodyTv, sharingTextTv;
LinearLayout articleDetailsLl;
final LinearLayout articlesPager, articleBookmarkBtn,
articleBookmarkedBtn, articleShareBtn;
contentIv = (ImageView) viewLayout.findViewById(R.id.content_iv);
contentHeadTv = (TextView) viewLayout.findViewById(R.id.content_head_tv);
contentBodyTv = (TextView) viewLayout.findViewById(R.id.content_body_tv);
articlesPager = (LinearLayout) viewLayout.findViewById(R.id.article_pager);
articlesLayout = (LinearLayout) viewLayout.findViewById(R.id.articles_layout);
rootView = viewLayout.findViewById(R.id.post_main_cv);
articleShareBtn.setTag(rootView);
RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(R.drawable.placeholder);
articlesLayout.setVisibility(View.VISIBLE);
Glide.with(context)
.setDefaultRequestOptions(requestOptions)
.load(articlesListChild.get(position).getArticleImage())
.into(contentIv);
toolbar.setVisibility(GONE);
articlesPager.setVisibility(GONE);
contentIv.setScaleType(ImageView.ScaleType.FIT_XY);
contentHeadTv.setText(articlesListChild.get(position).getArticleHeading().trim());
contentBodyTv.setText(articlesListChild.get(position).getArticleContent().trim());
contentSourceTv.setText(articlesListChild.get(position).getArticleSource().trim());
contentSourceTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Uri uri = Uri.parse(articlesListChild.get(position).getArticleSourceLink());
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
articleShareBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bitmap screenshotBitmap = takeScreenshot((View) view.getTag());
saveAndShareScreenshot(screenshotBitmap);
}
});
container.addView(viewLayout, 0);
return viewLayout;
}
private Bitmap takeScreenshot(View root) {
root.setDrawingCacheEnabled(true);
Bitmap screenshotBitmap = root.getDrawingCache();
return screenshotBitmap;
}
private void saveAndShareScreenshot(Bitmap screenshotBitmap) {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
// Save Screenshot
File myDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "/MyApp Screenshots");
myDir.mkdir();
String fname = "Image-" + 1 + ".jpg";
File file = new File(myDir, fname);
if (file.exists()) {
file.delete();
}
try {
file.createNewFile();
FileOutputStream out = new FileOutputStream(file);
screenshotBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
MediaScannerConnection.scanFile(context, new String[]{file.toString()}, new String[]{file.getName()}, null);
// Share Screenshot
file.setReadable(true, false);
final Intent intent = new Intent(Intent.ACTION_SEND);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri photoURI = FileProvider.getUriForFile(context, "com.xyz.abcapp.provider", file);
String shareBody = "Share"
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Read this article");
intent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
intent.putExtra(Intent.EXTRA_STREAM, photoURI);
intent.setType("image/*");
context.startActivity(Intent.createChooser(intent,"Share Using"));
} else {
Toast.makeText(context, "Permissions not granted", Toast.LENGTH_SHORT).show();
}
}
См. также Данные. Складной в стандартной библиотеке, которая обеспечивает a toList
функция для любого Foldable
экземпляр. Foldable
берет немного изощренности для инстанцирования, но это была бы хорошая практика. В качестве награды, Ваш HTree
тип является почти точно тем же как экземпляром в качестве примера в документации.
Кроме того, я рекомендую изменить Ваш HTree
кому:
data HTree a = Nil | Node a (HTree a) (HTree a)
И затем использование HTree (a,b)
вместо HTree a b
. Эта версия единственного параметра будет более легко компонуема со стандартными типами и экземплярами, и это становится главным из того, что продолжается, так как это зависит от обоих параметров таким же образом. Это также a Functor
, и определение такого экземпляра сделает этот тип действительно хорошим работать с.
Я рекомендовал бы, чтобы классы Типа не были так же полезны, как они сначала кажутся - если предполагаемый класс имеет всего один метод интерфейса, рассмотрите объявление функционального типа вместо этого. Я произошел из среды OO также и нашел, что провел слишком много времени, пытаясь сделать "класс" средним, что я думал, что это означало, когда действительно я должен был использовать "данные".
Намного легче только записать Ваш toList' функция и затем 'снять' его для работы на структуру данных. На самом деле приветствуемое еще одно Учебное руководство Haskell проходит обширное осуществление, показывающее, как оно сделано и использует двоичное дерево в качестве примера. Большая вещь о выполнении лифта является этим, отличает то, что важно - структура типа данных, не реализация toList' - поэтому, после того как лифт сделан для выполнения 'в обходе порядка типа данных', можно использовать лифт, чтобы сделать что-либо - toList, печать, безотносительно. Поддержка toList не является важной частью структуры данных, таким образом, это не должно быть в объявлении класса - важная часть - то, как пересечь структуру данных.
Вы, вероятно, хотите выбрать последнюю опцию для класса ToList и сделать (HTree a)
экземпляр ToList. Затем toList
имеет тип (HTree a b) -> [b]
, не, например, (HTree a b) -> [(a,b)]
. Я предполагаю, что Вы думаете столь же "ключевой" и тип "значения" как b.
class ToList a where
toList :: a b -> [b]
data HTree a b = Nil | Node a b (HTree a b) (HTree a b)
instance ToList (HTree a) where
toList Nil = []
toList (Node x y l r) = toList l ++ [y] ++ toList r
test = toList (Node "a" 1 (Node "b" 2 Nil Nil) Nil)
-- test == [2,1]