2015-03-06 3 views
0

У меня есть образец моего файла JSON (он довольно большой, поэтому я не буду показывать его все).JSON Image in new Actity

[ 
    { 
    "name":"Costel Pantilimon", 
    "position":"GK", 
    "age":"28", 
    " number":"1", 
    "photo":"images/costel_pantilimon.png" 
    }, 
    { 
    "name":"Vito Mannone", 
    "position":"GK", 
    "age":"27", 
    "number":"25", 
    "photo":"images/Mannone.png" 
    } 
] 

Отображает все объекты JSON в виде списка.

JSON listview

я нажимаю на первом ряду и имя игрока показывается в новой деятельности в простой TextView. Все идет нормально. Проблема в том, что я тоже хочу отображать изображение, и я борюсь с этим.

Вот часть моего кода, который выполняет эту работу в webservice.

public void onItemClick(AdapterView<?> parent, View view, int position,  
long id) { 
    String details = playersList.get(position).getDetails(); 

    //Log.d("Theo", details); 

    switch (position) { 
     case 0: 

      Intent i = new Intent(PlayersList.this, ExtraInfo.class); 
      i.putExtra("details", details); 


      startActivity(i); 
      break; 

    } 
    } 
    private class MyTask extends AsyncTask<String, String, List<Players>> { 

    @Override 
    protected void onPreExecute() { 
     if (tasks.size() == 0) { 
      pb.setVisibility(View.VISIBLE); 
     } 
     tasks.add(this); 
    } 

    @Override 
    protected List<Players> doInBackground(String... params) { 

     String content = HttpManager.getData(params[0]); 
     playersList = PlayersJSONParser.parseFeed(content); 

     for (Players p : playersList) { 
      try { 
       String imageUrl = PHOTOS_BASE_URL +p.getPhoto(); 
       InputStream in = (InputStream) new 
    URL(imageUrl).getContent(); 
       Bitmap bitmap = BitmapFactory.decodeStream(in); 
       p.setBitmap(bitmap); 
       in.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 

      } 
     } 

     return playersList; 
    } 

    @Override 
    protected void onPostExecute(List<Players> result) { 

     tasks.remove(this); 
     if (tasks.size() == 0) { 
      pb.setVisibility(View.INVISIBLE); 
     } 

     if (result == null) { 
      Toast.makeText(PlayersList.this, "Web service not available", 
    Toast.LENGTH_LONG).show(); 
      return; 
     } 

     playersList = result; 
     updateDisplay(); 

    } 

} 

И деятельность, которая фактически отображает имя

public class ExtraInfo extends ActionBarActivity { 
TextView detailsText; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_extra_info); 

    detailsText = (TextView)findViewById(R.id.detailsText); 
    String details = getIntent().getStringExtra("details"); 
    Log.d("Extra info", details); 

    detailsText.setText("" + details); 

    } 

} 

Любые идеи о том, как передать изображение в новой деятельности?

Спасибо за чтение моего вопроса,

Тео

+0

не большая проблема. Растровое изображение имеет решающее значение. – Blackbelt

ответ

1

Есть 4 Решения решить эту проблему

1. Изображение в ByteArray затем ByteArray изображения.

Первый конвертировать изображение в байт-массив, а затем перейти в Intent и в следующем действии получить массив байтов из Bundle и преобразовать в изображение (растровое изображение) и установить в ImageView.

Преобразование растровых изображений в байтовый массив:

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
byte[] byteArray = stream.toByteArray(); 

Pass байтовый массив в умыслом:

Intent intent = new Intent(this, NextActivity.class); 
intent.putExtra("picture", byteArray); 
startActivity(intent); 

Get байтовый массив из Bundle и конвертировать в растровое изображение:

Bundle extras = getIntent().getExtras(); 
byte[] byteArray = extras.getByteArray("picture"); 

Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 
ImageView image = (ImageView) findViewById(R.id.imageView1); 

image.setImageBitmap(bmp); 

2 Сначала сохраните изображение в SDCard и в следующем действии установите это изображение i nto ImageView.

3. Преобразуйте изображение в Base64, а затем передайте с Intent как String, затем снова декодируйте строку обратно в растровое изображение, чтобы установить изображение.

Для кодирования изображения в Base64:

public static String encodeToBase64(Bitmap image) 
    { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     image.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
     byte[] b = baos.toByteArray(); 
     String encodedBitmap = Base64.encodeToString(b, Base64.DEFAULT); 
     return encodedBitmap; 
    } 

Для декодирования Base64 для точечного рисунка:

public static Bitmap decodeBase64(String input) 
    { 
     byte[] decodedByte = Base64.decode(input, 0); 
     return BitmapFactory 
       .decodeByteArray(decodedByte, 0, decodedByte.length); 
    } 

4. Использование Parcelable

Вы можете передать растровое изображение как parcelable.

Перейти:

Intent intent = new Intent(this, youractivty.class); 
intent.putExtra("BitmapImage", yourBitmap); 

Чтобы получить:

Bitmap bitmap = (Bitmap) getIntent().getParcelableExtra("BitmapImage"); 
+0

Вещь в том, что я немного запутался в намерении.putExtra («BitmapImage», yourBitmap). Я не знаю, чтобы получить переменную «yourBitmap». Для простого текста, то есть имени, я могу просто написать i.putExtra («name», playerstList.get (position) .getName()). – Theo

+0

@ Theo Нет, это будет i.putExtra ("name", playerstList.get (position) .getBitmap()); При условии, что ваш PlayersList должен реализовать метод getter того же самого. –

+0

Все нормально, я исправил его. Большое спасибо за вашу помощь. – Theo

1

Bitmap реализует Parcelable, так что вы всегда можете передать его в намерении: Как это:

Intent intent = new Intent(this, ExtraInfo.class); 
intent.putExtra("BitmapImage", yourBitmap); 

и поймать это намерение в ваша деятельность:

Intent intent = getIntent(); 
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage"); 

чем установленный это растровый вашему взору изображения