Страница 1 из 2

Bunndle

Добавлено: 28 авг 2014, 14:39
yura91
как извлечь нужные данные из обьекта Bunndle если я допустим передал картинку из одного фрагмента в другой и данные там хранятся в Bunndle как их извлечь?? Можете привести простенький фрагмент кода??

Re: Bunndle

Добавлено: 28 авг 2014, 14:42
altwin
[syntax=java5]
Bundle extras = this.getIntent().getExtras();

String s = extras.getString("some string");
[/syntax]

Re: Bunndle

Добавлено: 28 авг 2014, 15:02
yura91
это если в активити а если в фрагмент передавать?? через setArguments то в принимающем фрагменте как бундл будет писаться?? и потом если не строку а картинку передаю как тогда??

Re: Bunndle

Добавлено: 28 авг 2014, 15:15
altwin
положить:
[syntax=java5]
Fragment fragment = new Fragment();
Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);
[/syntax]
достать ( в onCreate() ):
[syntax=java5]
Bundle bundle = this.getArguments();
int myInt = bundle.getInt(key, defaultValue);
[/syntax]

Re: Bunndle

Добавлено: 28 авг 2014, 16:46
yura91
а если картинку передаешь как будет??

Re: Bunndle

Добавлено: 28 авг 2014, 16:47
yura91
putInt сразу отправляет во второй фрагмент??

Re: Bunndle

Добавлено: 28 авг 2014, 18:36
yura91
а как картинку получить через Bunndle??

Re: Bunndle

Добавлено: 29 авг 2014, 08:34
klblk
yura91 писал(а):а как картинку получить через Bunndle??
Bitmap - реализует Parcelable интерфейс.
следовательно его можно записать в Bundle методом putParcelable() и получить getParcelable(String key)

Re: Bunndle

Добавлено: 29 авг 2014, 09:00
altwin
yura91 писал(а):а если картинку передаешь как будет??
Если картинка в ресурсах, то ничего не меняется, ее id - это число, для внешних уже ответили.

Re: Bunndle

Добавлено: 29 авг 2014, 14:34
yura91
а можете написать небольшой фрагмент кода как для внешних??

Re: Bunndle

Добавлено: 29 авг 2014, 15:44
altwin
yura91 писал(а):а можете написать небольшой фрагмент кода как для внешних??
проще всего не думать вообще и делать:

[syntax=java5]
Fragment fr = new Fragment();
Bundle bun = new Bundle();
bun.putString("selected_image", image_url);
fr.setArguments(bun);`
[/syntax]
и получить значение
[syntax=java5]
String image_url=getArguments().getString("selected_image");[/syntax]
если вместо url путь в файловой системе то либо ContentResolver либо простой путь через file://

Re: Bunndle

Добавлено: 29 авг 2014, 16:28
yura91
то есть это передается ссылка на картинку верно?? а сам обьект Bitmap то есть джепег файл прямо без всяких ссылок можно передать??как это будет выглядеть??

Re: Bunndle

Добавлено: 29 авг 2014, 16:41
Mikhail_dev
Можно передать через механизмы сериализации, но это будет выглядеть через 5 место, если не через десятое. Так никто не делает.

Re: Bunndle

Добавлено: 29 авг 2014, 16:48
altwin
yura91 писал(а):то есть это передается ссылка на картинку верно?? а сам обьект Bitmap то есть джепег файл прямо без всяких ссылок можно передать??как это будет выглядеть??
В аndroid есть такой интерфейс Serializable его может реализовать любой объект и по сути все, что происходит - упаковка любых данных в формат удобный для передачи, потом после приема выполняется unserialize и все становится на круги своя... но это действительно не много странно.
Но примерно так:
[syntax=java5]
private String title;
private int sourceWidth, currentWidth;
private int sourceHeight, currentHeight;
private Bitmap sourceImage;
private Canvas sourceCanvas;
private Bitmap currentImage;
private Canvas currentCanvas;
private Paint currentPaint;

protected class BitmapDataObject implements Serializable {
private static final long serialVersionUID = 111696345129311948L;
public byte[] imageByteArray;
}

/** Included for serialization - write this layer to the output stream. */
private void writeObject(ObjectOutputStream out) throws IOException{
out.writeObject(title);
out.writeInt(currentWidth);
out.writeInt(currentHeight);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
currentImage.compress(Bitmap.CompressFormat.PNG, 100, stream);
BitmapDataObject bitmapDataObject = new BitmapDataObject();
bitmapDataObject.imageByteArray = stream.toByteArray();

out.writeObject(bitmapDataObject);
}

/** Included for serialization - read this object from the supplied input stream. */
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
title = (String)in.readObject();
sourceWidth = currentWidth = in.readInt();
sourceHeight = currentHeight = in.readInt();

BitmapDataObject bitmapDataObject = (BitmapDataObject)in.readObject();
Bitmap image = BitmapFactory.decodeByteArray(bitmapDataObject.imageByteArray, 0, bitmapDataObject.imageByteArray.length);

sourceImage = Bitmap.createBitmap(sourceWidth, sourceHeight, Bitmap.Config.ARGB_8888);
currentImage = Bitmap.createBitmap(sourceWidth, sourceHeight, Bitmap.Config.ARGB_8888);

sourceCanvas = new Canvas(sourceImage);
currentCanvas = new Canvas(currentImage);

currentPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
thumbnailPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
thumbnailPaint.setARGB(255, 200, 200, 200);
thumbnailPaint.setStyle(Paint.Style.FILL);
}
[/syntax]
read и write object соотвественно сериализация и десериализация объекта, только теперь при распаковке нужно не String принимать а BitmapDataObject, но тут гораздо логичнее испольовать простые пути вроде content://

P.S. Сериализация тут точно не желательна лучше конвертировать изображение в byte array:
[syntax=java5]
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
[/syntax]
и потом забирать:
[syntax=java5]
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
ImageView image = (ImageView) findViewById(R.id.imageView1);

image.setImageBitmap(bmp);
[/syntax]
Опять же если при конвертировании используется изображение из assets - просто заменяете ресурсы на пути. И опять же принимая объект из bundle обращаете внимание на тип ожидаемого значения.

>> а сам обьект Bitmap то есть джепег файл прямо без всяких ссылок можно передать
путь в файловой системе это тоже ссылка но доступна не через url:// а через file:// или к примеру:
[syntax=java5]
File imgFile = new File(“/sdcard/Images/test_image.jpg”);
if(imgFile.exists()){
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
}
[/syntax]
и дальше делаете с ним что хотите, думаю что вполне можно imgFile.getAbsolutePath() передавать, а декодировать уже на клиенте.

Re: Bunndle

Добавлено: 29 авг 2014, 17:37
yura91
а как прописывается путь например к drawable assets ну и вообще к папкам которые в среде?? кстати для чего применяется assets только для хранения изображения??

Re: Bunndle

Добавлено: 29 авг 2014, 17:48
altwin
yura91 писал(а):а как прописывается путь например к drawable assets ну и вообще к папкам которые в среде?? кстати для чего применяется assets только для хранения изображения??
из drawable ресурсы достаются через R.java, а assets к примеру если использовать в webview, то можно через - file:///android_asset/имя_файла ( т.е. Bitmap bmp = BitmapFactory.decodeFile("file:///android_asset/pic.png"); )если нужно прочитать файл, то InputStream is = getAssets().open('имя_файла'), и хранить там можно любой файл.

Re: Bunndle

Добавлено: 29 авг 2014, 17:54
yura91
а в assets можно только картинки хранить??

Re: Bunndle

Добавлено: 29 авг 2014, 17:55
yura91
или все что угодно??

Re: Bunndle

Добавлено: 29 авг 2014, 20:30
yura91
в папке assets можно любы данные хранить??

Re: Bunndle

Добавлено: 29 авг 2014, 20:41
Mikhail_dev
да