6 Imageviews auf Akkustand triggern

  • Antworten:6
coreytaylor211
  • Forum-Beiträge: 9

20.11.2016, 16:44:03 via Website

Hallo zusammen,
Ich wollte wissen ob es möglich ist z.b 6 Imageviews über den Akkustand auf Visible/Invisible stellen zu lassen ? Das ganze soll ein Widget sein.
Ich habe schon gehört das man das so nicht macht, ich möchte trotzdem wissen ob es geht.

lieben Dank

— geändert am 20.11.2016, 17:04:18 durch Moderator

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.11.2016, 17:03:40 via Website

Hallo coreytaylor211,
ich habe deinen Threadtitel mal angepasst, bitte achte in Zukunft auf einen Aussagekräftigen Titel
Danke


Prinzipiell ja:
Vorgehen:
Für jedes Bild einen Akkustandsbereich festlegen ( bsp fürs erste bild 100% bis 85% etc..)
Dann Akkustand auslesen und auswerten und je nach Wert das passende Bild/Imageview anzeigen.

Aber:
Normalerweise zeichtet man das auf einer View/Canvas selber, anstatt vorefertigte Bilder zu benutzen...

LG Pascal //It's not a bug, it's a feature. :) ;)

coreytaylor211

Antworten
coreytaylor211
  • Forum-Beiträge: 9

20.11.2016, 17:15:48 via Website

Pascal P.

Hallo coreytaylor211,
ich habe deinen Threadtitel mal angepasst, bitte achte in Zukunft auf einen Aussagekräftigen Titel
Danke


Prinzipiell ja:
Vorgehen:
Für jedes Bild einen Akkustandsbereich festlegen ( bsp fürs erste bild 100% bis 85% etc..)
Dann Akkustand auslesen und auswerten und je nach Wert das passende Bild/Imageview anzeigen.

Aber:
Normalerweise zeichtet man das auf einer View/Canvas selber, anstatt vorefertigte Bilder zu benutzen...

Lieben Dank für die Anpassung und die Antwort.
Ja genau so habe ich das gemacht aber alles was ich versucht habe geht ab 5.1 nicht mehr.

Hier mal ein Beispiel vielleicht weißt du ja was ?

public class NewAppWidget extends AppWidgetProvider {

private final int BATTERY_STEPS = 10;
private RemoteViews widgetViews =
        new RemoteViews("layout",
                R.layout.new_app_widget);

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    ComponentName meinWidget = new ComponentName(context,NewAppWidget.class);

    for (int widgetId : appWidgetManager.getAppWidgetIds(meinWidget)){

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.new_app_widget);

        remoteViews.setImageViewResource(R.id.imageView,0);
        remoteViews.setImageViewResource(R.id.imageView2,0);
        remoteViews.setImageViewResource(R.id.imageView3,0);
        remoteViews.setImageViewResource(R.id.imageView4,0);
        remoteViews.setImageViewResource(R.id.imageView5,0);
        remoteViews.setImageViewResource(R.id.imageView6,0);
        remoteViews.setImageViewResource(R.id.imageView7,0);
        remoteViews.setImageViewResource(R.id.imageView8,0);
        remoteViews.setImageViewResource(R.id.imageView9,0);
        remoteViews.setImageViewResource(R.id.imageView10,0);
        appWidgetManager.updateAppWidget(widgetId,remoteViews);
    }

    Intent received = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    assert received != null;
    String receivedAction = received.getAction();
    if (receivedAction.equals(Intent.ACTION_BATTERY_CHANGED)){
        int level = received.getIntExtra("level",0);
        this.widgetViews.setImageViewResource(R.id.imageView,0);
        this.widgetViews.setImageViewResource(R.id.imageView2,0);
        this.widgetViews.setImageViewResource(R.id.imageView3,0);
        this.widgetViews.setImageViewResource(R.id.imageView4,0);
        this.widgetViews.setImageViewResource(R.id.imageView5,0);
        this.widgetViews.setImageViewResource(R.id.imageView6,0);
        this.widgetViews.setImageViewResource(R.id.imageView7,0);
        this.widgetViews.setImageViewResource(R.id.imageView8,0);
        this.widgetViews.setImageViewResource(R.id.imageView9,0);
        this.widgetViews.setImageViewResource(R.id.imageView10,0);

        showBars(level);

        ComponentName appComp = new ComponentName(context, NewAppWidget.class);

        AppWidgetManager.getInstance(context).updateAppWidget(appComp,widgetViews);
    }
}

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);

    PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wakel = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");


    wakel.acquire();

    ComponentName thisWidget = new ComponentName(context, NewAppWidget.class);
    AppWidgetManager manager = AppWidgetManager.getInstance(context);

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.new_app_widget);

    remoteViews.setImageViewResource(R.id.imageView,0);
    remoteViews.setImageViewResource(R.id.imageView2,0);
    remoteViews.setImageViewResource(R.id.imageView3,0);
    remoteViews.setImageViewResource(R.id.imageView4,0);
    remoteViews.setImageViewResource(R.id.imageView5,0);
    remoteViews.setImageViewResource(R.id.imageView6,0);
    remoteViews.setImageViewResource(R.id.imageView7,0);
    remoteViews.setImageViewResource(R.id.imageView8,0);
    remoteViews.setImageViewResource(R.id.imageView9,0);
    remoteViews.setImageViewResource(R.id.imageView10,0);


    manager.updateAppWidget(thisWidget, remoteViews);

    wakel.release();
}

@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
    super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);

    this.widgetViews.setImageViewResource(R.id.imageView,0);
    this.widgetViews.setImageViewResource(R.id.imageView2,0);
    this.widgetViews.setImageViewResource(R.id.imageView3,0);
    this.widgetViews.setImageViewResource(R.id.imageView4,0);
    this.widgetViews.setImageViewResource(R.id.imageView5,0);
    this.widgetViews.setImageViewResource(R.id.imageView6,0);
    this.widgetViews.setImageViewResource(R.id.imageView7,0);
    this.widgetViews.setImageViewResource(R.id.imageView8,0);
    this.widgetViews.setImageViewResource(R.id.imageView9,0);
    this.widgetViews.setImageViewResource(R.id.imageView10,0);
    showBars(appWidgetId);

}

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, NewAppWidget.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent,0);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000, 60000, pendingIntent);

    }

}

private void setPartStep(int partLevel)
{

    if(partLevel>BATTERY_STEPS) return;
    else
    {

        switch(partLevel)
        {
            case 1:
                this.widgetViews.setImageViewResource(R.id.imageView,0);
                this.widgetViews.setViewVisibility(R.id.imageView,
                        View.VISIBLE);
                break;
            case 2:
                this.widgetViews.setImageViewResource(R.id.imageView2,0);

                this.widgetViews.setViewVisibility(R.id.imageView2,
                        View.VISIBLE);
                break;
            case 3:
                this.widgetViews.setImageViewResource(R.id.imageView3,0);

                this.widgetViews.setViewVisibility(R.id.imageView3,
                        View.VISIBLE);
                break;
            case 4:
                this.widgetViews.setImageViewResource(R.id.imageView4,0);

                this.widgetViews.setViewVisibility(R.id.imageView4,
                        View.VISIBLE);
                break;
            case 5:
                this.widgetViews.setImageViewResource(R.id.imageView5,0);

                this.widgetViews.setViewVisibility(R.id.imageView5,
                        View.VISIBLE);
                break;
            case 6:
                this.widgetViews.setImageViewResource(R.id.imageView6,0);

                this.widgetViews.setViewVisibility(R.id.imageView6,
                        View.VISIBLE);
                break;
            case 7:
                this.widgetViews.setImageViewResource(R.id.imageView7,0);

                this.widgetViews.setViewVisibility(R.id.imageView7,
                        View.VISIBLE);
                break;
            case 8:
                this.widgetViews.setImageViewResource(R.id.imageView8,0);

                this.widgetViews.setViewVisibility(R.id.imageView8,
                        View.VISIBLE);
                break;
            case 9:
                this.widgetViews.setImageViewResource(R.id.imageView9,0);

                this.widgetViews.setViewVisibility(R.id.imageView9,
                        View.VISIBLE);
                break;
            case 10:
                this.widgetViews.setImageViewResource(R.id.imageView10,0);

                this.widgetViews.setViewVisibility(R.id.imageView10,
                        View.VISIBLE);
                break;
            default:
                break;
        }
    }
}


private void showBars(int currLevel)
{

    if(currLevel>=10)
    {
        this.widgetViews.setImageViewResource(R.id.imageView,0);

        this.widgetViews.setViewVisibility(R.id.imageView, View.VISIBLE);
    }
    else
        this.widgetViews.setViewVisibility(R.id.imageView, View.INVISIBLE);
    if(currLevel>=20)
    {
        this.widgetViews.setImageViewResource(R.id.imageView2,0);

        this.widgetViews.setViewVisibility(R.id.imageView2, View.VISIBLE);
    }
    else
        this.widgetViews.setViewVisibility(R.id.imageView2, View.INVISIBLE);
    if(currLevel>=30)
    {
        this.widgetViews.setImageViewResource(R.id.imageView3,0);

        this.widgetViews.setViewVisibility(R.id.imageView3, View.VISIBLE);
    }
    else
        this.widgetViews.setViewVisibility(R.id.imageView3, View.INVISIBLE);
    if(currLevel>=40)
    {
        this.widgetViews.setImageViewResource(R.id.imageView4,0);

        this.widgetViews.setViewVisibility(R.id.imageView4, View.VISIBLE);
    }
    else
        this.widgetViews.setViewVisibility(R.id.imageView4, View.INVISIBLE);
    if(currLevel>=50)
    {
        this.widgetViews.setImageViewResource(R.id.imageView5,0);

        this.widgetViews.setViewVisibility(R.id.imageView5, View.VISIBLE);
    }
    else
        this.widgetViews.setViewVisibility(R.id.imageView5, View.INVISIBLE);
    if(currLevel>=60)
    {
        this.widgetViews.setImageViewResource(R.id.imageView6,0);

        this.widgetViews.setViewVisibility(R.id.imageView6, View.VISIBLE);
    }
    else
        this.widgetViews.setViewVisibility(R.id.imageView6, View.INVISIBLE);
    if(currLevel>=70)
    {
        this.widgetViews.setImageViewResource(R.id.imageView7,0);

        this.widgetViews.setViewVisibility(R.id.imageView7, View.VISIBLE);
    }
    else
        this.widgetViews.setViewVisibility(R.id.imageView7, View.INVISIBLE);
    if(currLevel>=80)
    {
        this.widgetViews.setImageViewResource(R.id.imageView8,0);

        this.widgetViews.setViewVisibility(R.id.imageView8, View.VISIBLE);
    }
    else
        this.widgetViews.setViewVisibility(R.id.imageView8, View.INVISIBLE);
    if(currLevel>=90)
    {
        this.widgetViews.setImageViewResource(R.id.imageView9,0);

        this.widgetViews.setViewVisibility(R.id.imageView9, View.VISIBLE);
    }
    else
        this.widgetViews.setViewVisibility(R.id.imageView9, View.INVISIBLE);
    if(currLevel>=100)
    {
        this.widgetViews.setImageViewResource(R.id.imageView10,0);

        this.widgetViews.setViewVisibility(R.id.imageView10, View.VISIBLE);
    }
    else
        this.widgetViews.setViewVisibility(R.id.imageView10, View.INVISIBLE);


    int partLevel = currLevel%BATTERY_STEPS;
    int fullSteps = currLevel-partLevel;
    if(partLevel>0) setPartStep((fullSteps/BATTERY_STEPS)+1);
}

}

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.11.2016, 17:39:59 via Website

  1. Ich sehe immer nur den gleichen Code, warum lagerst du diesen nicht in eine Methode aus??
  2. Ich sehe immer das:
    remoteViews.setImageViewResource(R.id.imageView10,0);
    Du setzt auf jedes ImageView die Ressource 0, aber du musst doch statt 0 dein Icon angeben welches in den Drawables ist...

Und warum so kompliziert, da reicht doch eine Imageview die nur die Resource wechselt..

z.b. Pseudocode:

void onBatteryChanged(Intent i) // Broadcast Receiver
{

int battLevel = i.getIntExtra("level",0);
int imgResId = -1;

if(battLevel <=100 && battLevel >=85)
{
  imgResId = R.drawable.myPic1;
}
else if(battLevel<=84 && battLevel >= 70)
{
imgResId = R.drawable.myIcon2;
}
else if(..usw...)
....

this.widgetViews.setImageViewResource(R.id.imageView,imgResId);//Bild in der eintigen ImageView ändern wenn nötig

}

LG Pascal //It's not a bug, it's a feature. :) ;)

coreytaylor211

Antworten
swa00
  • Forum-Beiträge: 3.704

20.11.2016, 17:49:37 via Website

Hallo Corey,

willkommen im Forum.

Da du ja schon ausreichend Hilfe von mir in einem anderem Forum zu diesem Thema erhalten hast,
ich dein Projekt komplett angeschaut habe, dir dazu schon umfangreich Tips und Vorgehensweise
per PN aufgrund deines Codes gegeben habe ...

bin ich schon ein wenig erstaunt, dass du nun hier die gleiche Frage nochmal stellst und offensichtlich
jegliche Tips ignorierst -

-Warum ? - Dann kann man sich die Zeit als "Helfender" sparen - schon ein wenig Dreist ...

@Pascal
Er will eine art Radar bauen , die er aus pngs zusammensetzt und hat in einem WidgetLayout 70 x Imageviews dazu
definiert - das Ding ackert ohne Ende beim Init.
Er hat einige Resourcen/Basic probleme und so wie er sein Projekt hat, kann es nicht klappen.
Der Code, den er hier postet ist ein Bruchteil ... Ich habe ihm zu Canvas angeraten ..

Ich sehe immer nur den gleichen Code, warum lagerst du diesen nicht in eine Methode aus??
Ich sehe immer das:
remoteViews.setImageViewResource(R.id.imageView10,0);
Du setzt auf jedes ImageView die Ressource 0, aber du musst doch statt 0 dein Icon angeben welches in den Drawables ist...

Auch das habe ich ihm schon geschrieben .... Deja -Vu

— geändert am 20.11.2016, 18:10:47

Liebe Grüße - Stefan
[ App - Entwicklung ]

coreytaylor211

Antworten
coreytaylor211
  • Forum-Beiträge: 9

20.11.2016, 18:19:40 via Website

@Pascal P
Ok lieben Dank, ja das mit der Ressource auf 0 hat bis jetzt ja immer geklappt weil ich ja nicht nur 1 ImageView habe.

@swa00
Du hast mir natürlich sehr geholfen, aber es ist ja nicht verboten sich woanders noch Meinung / Anregungen zu holen wie verschiedene Personen an das Problem rann gehen.

Davon abgesehen ist das eigentliche Problem ja nicht gelöst, in dem anderen Forum hatte ich gefragt warum der Code nicht mehr geht, und nicht was ich besser machen kann.
Ich wollte nur wissen warum der Code (egal wie schlecht er ist) bis Android 5.0 funktioniert hat und danach nicht mehr.

Das sich das Widget leichter, eleganter, performanter u.s.w realisieren lässt ist mir klar, nur die Frage die ich hatte konntest du mir leider auch nicht beantworten.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.11.2016, 18:49:48 via Website

Die Frage: "Warum geht mein Coe nicht mehr" kannst du dir sparen ;)
Vielmehr ist dabei der Log + Errors etc wichtig und die genaue Beschreibung (evtl. Scrennshots) von Vorher/Nachher.
Ich kenne jetzt den Changelog nicht auswendig, aber könnte schon sein, dass da was herumgeschraubt wurde und es deswegen nicht mehr geht.
Aber solche Probleme wird man immer haben.
Im zweifelsfall wirft man sein konzept über Bord und programmiert es auf basis von Android 6.0 komplett neu. (man kann ja auschnitte verwenden wenn nötig).
Aber dann kannst du sichergehen, dass es funktioniert.

LG Pascal //It's not a bug, it's a feature. :) ;)

coreytaylor211

Antworten