setCompoundDrawableWithIntrinsicBounds并未绘制任何内容...但仅在某些时候

时间:2019-06-03 09:19:52

标签: android android-drawable

我正在以编程方式创建一些按钮,我以这种方式添加了按钮:

final Button btn = new Button(this);
                    btn.setText(array.get(i));
                    btn.setTextSize(10);
                    btn.setTextColor(getColor(R.color.white));
                    btn.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            goToModule(texto);
                        }
                    });
                    btn.setHeight(height);
                    btn.setWidth(width);
                    btn.setOnTouchListener(parentListener);
                    btn.post(new Runnable() {
                        @Override
                        public void run() {
                            btn.setCompoundDrawablesWithIntrinsicBounds(null,getDrawableForText(texto),null, null);
                            btn.setPadding(0,35,0,0);
                            btn.setBackground(gd);
                            btn.setLayoutParams(params);
                        }
                    });

                    row1.addView(btn);

最多可以绘制19个按钮。它们位于ViewFlippers内部,因此用户可以在页面之间进行页面

getDrawableForText方法:

private Drawable getDrawableForText(String texto) {
    Drawable drawable=null;
    if(texto.equalsIgnoreCase("Viajes")){
        Log.i("LOG", "This drawable is the problematic one");
    }
    if (texto.equals(textosBotones[0])) {
        drawable=getResources().getDrawable(R.drawable.vuelo,getTheme());//Viajes

    } else if (texto.equals(textosBotones[1])) {
        drawable=getResources().getDrawable(R.drawable.hotel,getTheme());//Hotel

    } else if (texto.equals(textosBotones[2])) {
        drawable=getResources().getDrawable(R.drawable.agenda,getTheme());//Agenda
        /*int h = btn.getHeight()-100;
        int w = btn.getWidth()-100;
        drawable.setBounds( 0, 0, w, h );
        Bitmap icon= BitmapFactory.decodeResource(getResources(),R.drawable.agenda);
        Bitmap newbitMap = Bitmap.createScaledBitmap(icon,w,h, true);
        dr = new BitmapDrawable(EventActivity.this.getResources(), newbitMap);*/

    } else if (texto.equals(textosBotones[3])) {
        drawable=getResources().getDrawable(R.drawable.ponentes,getTheme());//Ponentes


    } else if (texto.equals(textosBotones[4])) {
        drawable=getResources().getDrawable(R.drawable.documentos,getTheme());//Documentos


    } else if (texto.equals(textosBotones[5])) {
        drawable=getResources().getDrawable(R.drawable.ubicacion,getTheme());//Ubicaciones


    } else if (texto.equals(textosBotones[6])) {
        drawable=getResources().getDrawable(R.drawable.contactos,getTheme());//Contactos


    } else if (texto.equals(textosBotones[7])) {
        //drawable=getResources().getDrawable(R.drawable.preguntas,getTheme());//Encuestas
        drawable=getResources().getDrawable(R.drawable.valoracion,getTheme());//Encuestas/valoraciones

    } else if (texto.equals(textosBotones[8])) {
        drawable=getResources().getDrawable(R.drawable.qr,getTheme());//Distintivo/best business


    } else if (texto.equals(textosBotones[9])) {
        drawable=getResources().getDrawable(R.drawable.info,getTheme());//Forum

    } else if (texto.equals(textosBotones[10])) {
        drawable=getResources().getDrawable(R.drawable.galeria,getTheme());//Galería


    } else if (texto.equals(textosBotones[11])) {
        drawable=getResources().getDrawable(R.drawable.chat,getTheme());//Chats


    } else if (texto.equals(textosBotones[12])) {
        drawable=getResources().getDrawable(R.drawable.muro,getTheme());//Muro


    } else if (texto.equals(textosBotones[13])) {
        drawable=getResources().getDrawable(R.drawable.asistentes,getTheme());//Asistentes


    } else if (texto.equals(textosBotones[14])) {
        drawable=getResources().getDrawable(R.drawable.twitter,getTheme());//Twitter


    } else if (texto.equals(textosBotones[15])) {
        drawable=getResources().getDrawable(R.drawable.twitter,getTheme());//Facebook


    } else if (texto.equals(textosBotones[16])) {
        drawable=getResources().getDrawable(R.drawable.twitter,getTheme());//Instagram


    } else if (texto.equals(textosBotones[17])) {
        drawable=getResources().getDrawable(R.drawable.qr,getTheme());//QR


    } else if (texto.equals(textosBotones[18])) {
        drawable=getResources().getDrawable(R.drawable.valoracion,getTheme());//Proveedores


    } else if (texto.equals(textosBotones[19])){
        /*drawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.trophy,getTheme()));
        DrawableCompat.setTint(drawable, getColor(R.color.white));*/
        /*drawable=getResources().getDrawable(R.drawable.trophy,getTheme());
        Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
        DrawableCompat.setTint(wrappedDrawable, getColor(R.color.white));
        drawable=wrappedDrawable;*/
        drawable=getResources().getDrawable(R.drawable.actividad, getTheme());//Actividades
    }else if(texto.equals(textosBotones[20])){
        drawable=getResources().getDrawable(R.drawable.noticias,getTheme());
    }else{
        Log.i("LOG", "Something weird happened");
    }
    return drawable;
}

我第一次进入此活动,可绘制对象绘制正确。但是,如果我单击其中一个按钮(转到另一个活动),并且在该新活动内部,则单击一个按钮,该按钮转到第三个活动,如果我返回到主活动(按钮所在的位置)是一个未绘制的可绘制对象,它始终是第一个。其余按钮的其余可绘制对象均被确定为正常。

不再重新创建主活动,它保留在内存中。无论如何,如果我再次绘制它,也会发生相同的怪异行为。

我很迷茫,因为第三个活动不会以任何方式影响第一个活动。

有人可以指导我发生什么事情?

谢谢。

PD:如果您需要更多详细信息,请告诉我。

编辑:

在第三项活动中,我正在执行以下操作:

private void getArrivalsFromJSON(String resp) {
    arrivals=new ArrayList<>();
    ArrivalModel all=new ArrivalModel();
    all.setDestination("");
    all.setTerminal("ALTTODO");
    all.setType("");
    arrivals.add(all);
    try {
        JSONObject json=new JSONObject(resp);
        JSONArray data=json.getJSONArray("data");
        for(int i=0;i<data.length();i++){
            JSONObject obj=data.getJSONObject(i);
            ArrivalModel arrival=new ArrivalModel();
            arrival.setDestination(obj.getString("destination"));
            arrival.setTerminal(obj.getString("terminal"));
            arrival.setType(obj.getString("type"));
            arrivals.add(arrival);
        }
        generateLayout();
    } catch (JSONException e) {
        e.printStackTrace();
    }

}

在那方面,如果我修改以下行:

for(int i=0;i<data.length();i++)

并像这样更改它:

for(int i=0;i<data.length()-7;i++)

可绘制按钮正常绘制!我已经签入Android Studio探查器,并且它从未使用超过90Mb的RAM。太多了吗?

1 个答案:

答案 0 :(得分:0)

我发现了错误。与内存或其他性能问题无关。

发生的是,在第三个活动中,我使用的是按钮中使用的.png字体,但是我正在更改其颜色:

d.setColorFilter(new PorterDuffColorFilter(Color.parseColor(color), PorterDuff.Mode.MULTIPLY));

因此,当我回到第一个Activity并尝试绘制Drawable时,它正在绘制,但是其颜色发生了变化。假定按钮的颜色与我用来更改可绘制对象的颜色相同,则似乎未绘制可绘制对象。事实上它正在绘制,但不可见。