PDA

Ver la Versión Completa : [ CONSULTA ] Error bitmap en palette


LEAJIM_454
09/04/15, 23:00:58
Hola, necesito de su ayuda si no es mucha molestia, tengo un array de drawables en donde guardo las imagenes pero el problema es que no me permite extraer el que se está mostrando actualmente para ponerlo en palette para extraer el vibrantColor es justo en este metodo donde falla y me salta error el logCat
private void llenarLayout() {
BitmapPalette = BitmapFactory.decodeResource(view.getResources(), ABC_imagenes[posicionLetra]);
PaletteLetra = Palette.generate(BitmapPalette);
letraTitulo.setText(ABCLetras[posicionLetra]);
letraImagen.setImageResource(letraBackGround.getRe sourceId(posicionLetra, posicionLetra));
ContenedorDeLetra.setBackgroundColor(PaletteLetra. getVibrantColor(0));
MA.speak(descripcionLetras[posicionLetra]);
}

El error es este:
04-09 16:58:53.793: W/ResourceType(7403): No package identifier when getting value for resource number 0x00000000
04-09 16:58:53.965: W/dalvikvm(7403): threadid=1: thread exiting with uncaught exception (group=0x40018578)
04-09 16:58:54.168: E/AndroidRuntime(7403): FATAL EXCEPTION: main
04-09 16:58:54.168: E/AndroidRuntime(7403): java.lang.IllegalArgumentException: bitmap can not be null
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.support.v7.graphics.Palette.checkBitmapPar am(Palette.java:521)
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.support.v7.graphics.Palette.generate(Palet te.java:128)
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.support.v7.graphics.Palette.generate(Palet te.java:115)
04-09 16:58:54.168: E/AndroidRuntime(7403): at com.JimSoft.Edu.LearnWithEnuma.LetraFragment.llena rLayout(LetraFragment.java:96)
04-09 16:58:54.168: E/AndroidRuntime(7403): at com.JimSoft.Edu.LearnWithEnuma.LetraFragment.onCre ateView(LetraFragment.java:90)
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.support.v4.app.Fragment.performCreateView( Fragment.java:1786)
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.support.v4.app.FragmentManagerImpl.moveToS tate(FragmentManager.java:953)
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.support.v4.app.FragmentManagerImpl.moveToS tate(FragmentManager.java:1136)
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.support.v4.app.BackStackRecord.run(BackSta ckRecord.java:739)
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.support.v4.app.FragmentManagerImpl.execPen dingActions(FragmentManager.java:1499)
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.support.v4.app.FragmentManagerImpl$1.run(F ragmentManager.java:456)
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.os.Handler.handleCallback(Handler.java:587 )
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.os.Handler.dispatchMessage(Handler.java:92 )
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.os.Looper.loop(Looper.java:130)
04-09 16:58:54.168: E/AndroidRuntime(7403): at android.app.ActivityThread.main(ActivityThread.jav a:3687)
04-09 16:58:54.168: E/AndroidRuntime(7403): at java.lang.reflect.Method.invokeNative(Native Method)
04-09 16:58:54.168: E/AndroidRuntime(7403): at java.lang.reflect.Method.invoke(Method.java:507)
04-09 16:58:54.168: E/AndroidRuntime(7403): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:867)
04-09 16:58:54.168: E/AndroidRuntime(7403): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:625)
04-09 16:58:54.168: E/AndroidRuntime(7403): at dalvik.system.NativeStart.main(Native Method)

Gracias por su tiempo.

kriogeN
09/04/15, 23:26:26
Parece que la línea que te falla es esta:

PaletteLetra = Palette.generate(BitmapPalette);

Lo que significa que BitmapPalette es null, además si tienes en cuenta este Warning:

04-09 16:58:53.793: W/ResourceType(7403): No package identifier when getting value for resource number 0x00000000

Te está diciendo que has tratado de recuperar el recurso número 0 y no existe, por tanto todo indica que:

ABC_imagenes[posicionLetra]

es 0, revisa donde asignas esa variable antes de la ejecución de "llenarLayout"

LEAJIM_454
10/04/15, 01:58:50
Parece que la línea que te falla es esta: PaletteLetra = Palette.generate(BitmapPalette); Lo que significa que BitmapPalette es null, además si tienes en cuenta este Warning: 04-09 16:58:53.793: W/ResourceType(7403): No package identifier when getting value for resource number 0x00000000 Te está diciendo que has tratado de recuperar el recurso número 0 y no existe, por tanto todo indica que: ABC_imagenes[posicionLetra] es 0, revisa donde asignas esa variable antes de la ejecución de "llenarLayout"
Hola, gracias por tu pronta respuesta, el array no está vacío por que de el extraigo y seteo (Si esta bien dicho) a el image view, el imageview se muestra de forma correcta pero cuando puse palette a mi fragment comenzó a fallar, este es el array:
este está en values-es/dimens.xml
<resources>
<integer-array name="abc_imagenes">
<item>@drawable/letra_a</item>
<item>@drawable/letra_b</item>
<item>@drawable/letra_c</item>
<item>@drawable/letra_d</item>
<item>@drawable/letra_e</item>
<item>@drawable/letra_f</item>
<item>@drawable/letra_g</item>
<item>@drawable/letra_h</item>
<item>@drawable/letra_i</item>
<item>@drawable/letra_j</item>
<item>@drawable/letra_k</item>
<item>@drawable/letra_l</item>
<item>@drawable/letra_m</item>
<item>@drawable/letra_n</item>
<item>@drawable/letra_n2</item>
<item>@drawable/letra_o</item>
<item>@drawable/letra_p</item>
<item>@drawable/letra_q</item>
<item>@drawable/letra_r</item>
<item>@drawable/letra_s</item>
<item>@drawable/letra_t</item>
<item>@drawable/letra_u</item>
<item>@drawable/letra_v</item>
<item>@drawable/letra_w</item>
<item>@drawable/letra_x</item>
<item>@drawable/letra_y</item>
<item>@drawable/letra_z</item>
</integer-array>

</resources>y el valor es aleatorio por que se manda desde un fragment anterior dependiendo de la letra que se haya pulsado, este valor es enviado como bundle, gracias de nuevo.
Edito: tambien tengo este array declarado en res/values/dimens.xml para el idioma inglés

mocelet
10/04/15, 09:53:26
Haz una prueba, pon directamente R.drawable.letra_a en vez de ABC_imagenes [posicion]

Si te funciona está claro que hay algo mal en ese array.

LEAJIM_454
10/04/15, 14:26:01
Haz una prueba, pon directamente R.drawable.letra_a en vez de ABC_imagenes [posicion] Si te funciona está claro que hay algo mal en ese array.
Hice lo que me dijiste, y todo anda bien inlusive cambian los colores de las vistas, pero no funciona con el array, si gustas te dejo aqui el codigo del fragment para que puedas verlo, lo dejo como estaba en un principio

package com.JimSoft.Edu.LearnWithEnuma;

import java.util.Locale;

import android.app.Activity;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.graphics.Palette;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class LetraFragment extends Fragment implements OnClickListener {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

private String mParam1;
private String mParam2;

private View view;
private TextView letraTitulo,letraDescripcion;
private ImageView letraImagen;
private ImageButton letraAnterior,letraSiguiente;
private Bitmap BitmapPalette;
private LinearLayout ContenedorDeLetra;

private OnFragmentInteractionListener mListener;

private int[] ABC_imagenes;
private String[] ABCLetras, descripcionLetras;
private int posicionLetra;
private TypedArray letraBackGround;
private MainActivity MA;
private Palette PaletteLetra;


public static LetraFragment newInstance(String param1, String param2) {
LetraFragment fragment = new LetraFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}

public LetraFragment() {
}

override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}

override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_letra, container, false);
String letraPosition = getArguments().getString("getLetra");
letraTitulo = (TextView)view.findViewById(R.id.LetraTitulo);
letraImagen = (ImageView)view.findViewById(R.id.LetraImagen);
letraAnterior = (ImageButton)view.findViewById(R.id.LetraAtras);
letraSiguiente = (ImageButton)view.findViewById(R.id.LetraSiguiente );
letraDescripcion = (TextView)view.findViewById(R.id.LetraDescripcion) ;
ABCLetras = getResources().getStringArray(R.array.titulos_abc) ;
descripcionLetras = getResources().getStringArray(R.array.Conceptos_AB C);
posicionLetra = Integer.parseInt(letraPosition);
ABC_imagenes = getResources().getIntArray(R.array.abc_imagenes);
letraBackGround = getResources().obtainTypedArray(R.array.abc_imagen es);
letraAnterior.setOnClickListener(this);
letraSiguiente.setOnClickListener(this);

MA = (MainActivity)getActivity();

ContenedorDeLetra = (LinearLayout)view.findViewById(R.id.ContenedorLet ra);
llenarLayout();
return view;
}

private void llenarLayout() {
BitmapPalette = BitmapFactory.decodeResource(view.getResources(), ABC_imagenes[posicionLetra]);

PaletteLetra = Palette.generate(BitmapPalette);
letraTitulo.setText(ABCLetras[posicionLetra]);
letraImagen.setImageResource(letraBackGround.getRe sourceId(posicionLetra, posicionLetra));
ContenedorDeLetra.setBackgroundColor(PaletteLetra. getVibrantColor(0));
MA.speak(descripcionLetras[posicionLetra]);
}

public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}

override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}

override
public void onDetach() {
super.onDetach();
mListener = null;
}

private void LetraAtras() {
posicionLetra=posicionLetra-1;
if (posicionLetra==0) {
view.findViewById(R.id.LetraAtras).setClickable(fa lse);
}else {
view.findViewById(R.id.LetraAtras).setClickable(tr ue);
}
view.findViewById(R.id.LetraSiguiente).setClickabl e(true);
llenarLayout();
}

private void LetraAdelante() {
if (posicionLetra==getResources().getStringArray(R.ar ray.Abecedario).length-1) {
view.findViewById(R.id.LetraSiguiente).setClickabl e(false);
}else {
view.findViewById(R.id.LetraSiguiente).setClickabl e(true);
posicionLetra=posicionLetra+1;
Log.d("I", String.valueOf(getResources().getStringArray(R.arr ay.Abecedario).length));
llenarLayout();
}
}

override
public void onClick(View v) {
switch (v.getId()) {
case R.id.LetraAtras:
if (MA.tts!=null) {
MA.tts.stop();
}
LetraAtras();
break;
case R.id.LetraSiguiente:
if (MA.tts!=null) {
MA.tts.stop();
}
LetraAdelante();
break;
default:
break;
}
}

}

Gracias.

mocelet
10/04/15, 15:18:41
El problema es cómo defines el array en el XML, según la documentación de Android los arrays de drawables se hacen así (ver último ejemplo) http://developer.android.com/guide/topics/resources/more-resources.html#TypedArray

Quizá el usar un integer-array en vez de un array es el problema (explicaría que todo valiera 0 si en los XML no sabe convertir un drawable a un int)

A mí particularmente no me gustan demasiado los XML... es mucho más fácil y corto un int[] imagenes = new int[]{R.drawable.letraA, R.drawable.letraB, ...};

LEAJIM_454
11/04/15, 03:10:13
A mí particularmente no me gustan demasiado los XML... es mucho más fácil y corto un int[] imagenes = new int[]{R.drawable.letraA, R.drawable.letraB, ...};
Tambien lo habia pensado pero el problema que tuve es que no en todo idioma este array tendria la misma longitud y tampoco el mismo orden, ahora si funciona de maravilla.
Gracias Mocelet y kriogeN, siempre me sacan de apuros.