#java #android #json #xml
public class Fragment_photo extends Fragment { private ImageView nameImage; private Subject mSubject; private Content content; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AssetManager mgr=getActivity().getAssets(); ObjectMapper mapper= new ObjectMapper(); try { InputStream inputStream; inputStream = mgr.open("numbers.xml"); mSubject = mapper.readValue(inputStream, Subject.class); } catch (IOException e) { e.printStackTrace(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_photo, container, false); nameImage = (ImageView) v.findViewById(R.id.name_image); nameImage.setImageURI(Uri.parse(??? )); return v; } } другой класс public class Content { public String signature; public String photos; public String sounds; } и еще один public class Subject { public String name; public ArrayListcontent; } как теперь из mSubject вытащить данные и вставить в ImageView картинку? P.S. как выглядят данные в mSubject ?? сам файл { "name": "numbers", "content": [{ "photos": "file:///android_asset/numbers/1.jpg", "signature": "Один", "sounds": "file:///android_asset/numbers/1.wav" }, { "photos": "file:///android_asset/numbers/2.jpg", "signature": "Два", "sounds": "file:///android_asset/numbers/2.wav" } ]}
Ответы
Ответ 1
В общем проблема состоит из двух частей: Во-первых, надо взять ссылку. После работы Jackson вы получите Subject mSubject, и для того файла, который вы привели, сработает такое: String ref = mSubject.content.get(0).photos; Естественно, надо проверять, что в списке есть элементы, возможно следует проверить наличие самого списка и вообще mSubject. Во-вторых, полученную ссылку (file:///android_asset/numbers/1.jpg) не может обработать imageView.setImageUri(..). Вернее он может, но будет искать файл в файловой системе, по пути /android_asset/number/1.jpg и не найдет, т.к. файл у вас скорее всего лежит в assets, где-то рядом с numbers.xml. Насколько я понял, ссылки на assets вида file:///android_asset/.. понимают только WebView и библиотека Picasso (там отдельный обработчик). Можно вынуть файл из Assets вручную, каким-то таким способом: public class Fragment_photo extends Fragment { private ImageView nameImage; private Subject mSubject; private Content content; // новое поле для картинки private Drawable drawableView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AssetManager mgr=getActivity().getAssets(); ObjectMapper mapper= new ObjectMapper(); try { // ваш код в onCreate InputStream inputStream; inputStream = mgr.open("numbers.xml"); mSubject = mapper.readValue(inputStream, Subject.class); // достаем ссылку Uri imgUri = Uri.parse(mSubject.content.get(0).photos); // обрезка ссылки до состояния 'numbers/1.jpg' InputStream stream = mgr.open( imgUri.getPath().substring("/android_asset/".length()) ); drawableView = Drawable.createFromStream(stream, null); } catch (IOException e) { e.printStackTrace(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_photo, container, false); nameImage = (ImageView) v.findViewById(R.id.name_image); nameImage.setImageDrawable(drawableView); return v; } }Ответ 2
Видимо вам надо сделать что-то типа такого: try { InputStream inputStream; inputStream = mgr.open("numbers.xml"); mSubject = mapper.readValue(inputStream, Subject.class); if (mSubject.content != null && mSubject.content.size() != 1) { content = mSubject.content.get(0); } } catch (IOException e) { e.printStackTrace(); } НО! Как вы видите из кода, в списке может не оказаться элементов, это вам надо как-то обрабатывать и элементов в списке может быть больше 1 или 0, с этим тоже что-то надо сделать. Что именно я вам подсказать не могу, это зависит от логики приложения.
Комментариев нет:
Отправить комментарий