Кнопка виджета Android отправляет неверный идентификатор - PullRequest
0 голосов
/ 25 октября 2018

У меня есть кнопка в моем виджете, но я делаю два одинаковых виджета (например, с идентификаторами 119 и 120) и нажимаю на кнопку, это будет отправлять идентификатор последнего виджета (в примере 120), однако я нажимаю на первый виджет(119).Я знаю, в чем проблема, но я не знаю, как ее решить.

Поставщик виджетов:

public class widget_test extends AppWidgetProvider {

static RemoteViews remoteViews = null;
static AppWidgetManager appWidgetManager2 = null;
static AppWidgetProviderInfo providerInfo;
static Context context2;

public static String CLOCK_WIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE";

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                            int appWidgetId) {

    CharSequence widgetText = widget_testConfigureActivity.loadTitlePref(context, appWidgetId);

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_test);

    providerInfo = AppWidgetManager.getInstance(context).getAppWidgetInfo(appWidgetId);

    views.setTextViewText(R.id.appwidget_text, widgetText);
    remoteViews = views;
    appWidgetManager2 = appWidgetManager;
    context2 = context;

    String adresa = widget_testConfigureActivity.loadAdresaPref(context, appWidgetId).toString();
    new FetchDataTask().execute(adresa, String.valueOf(appWidgetId));

    System.err.println("ID: " + appWidgetId);

    Intent configIntent = new Intent(context, WidgetSettings.class);
    configIntent.putExtra("widget_id", appWidgetId);
    configIntent.putExtra("widget_name", widgetText);
    PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    views.setOnClickPendingIntent(R.id.widget_button_setting, configPendingIntent);

    appWidgetManager.updateAppWidget(appWidgetId, views);
}

public static boolean isConnected(){
    ConnectivityManager connMgr = (ConnectivityManager) context2.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected())
        return true;
    else
        return false;
}

public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    if (CLOCK_WIDGET_UPDATE.equals(intent.getAction())) {
        Date datum = new Date();
        if(datum.getMinutes() % 5 == 0) {
            ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
            int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
            for (int appWidgetID : ids) {
                System.err.println("UPDATE!");
                updateAppWidget(context, appWidgetManager, appWidgetID);
            }
        }
    }
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    // There may be multiple widgets active, so update all of them
    for (int appWidgetId : appWidgetIds) {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }
}

@Override
public void onDeleted(Context context, int[] appWidgetIds) {
    // When the user deletes the widget, delete the preference associated with it.
    for (int appWidgetId : appWidgetIds) {
        widget_testConfigureActivity.deleteTitlePref(context, appWidgetId);
        widget_testConfigureActivity.deleteAdresaPref(context, appWidgetId);
    }
}

@Override
public void onEnabled(Context context) {
    // Enter relevant functionality for when the first widget is created
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 1);
    alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 60000, createClockTickIntent(context));

    ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
    for (int appWidgetId : ids) {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }
}

private PendingIntent createClockTickIntent(Context context) {
    Intent intent = new Intent(CLOCK_WIDGET_UPDATE);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    return pendingIntent;
}

private PendingIntent createClockTickIntentCancel(Context context) {
    System.err.println("Cancel");
    Intent intent = new Intent(CLOCK_WIDGET_UPDATE);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    return pendingIntent;
}


@Override
public void onDisabled(Context context) {
    // Enter relevant functionality for when the last widget is disabled
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(createClockTickIntentCancel(context));
}

private static class FetchDataTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        if(isConnected() == true) {
            InputStream inputStream = null;
            String result = null;
            HttpClient client = new DefaultHttpClient();
            if (!params[0].equals("null")) {
                HttpGet httpGet = new HttpGet(params[0]);
                try {
                    HttpResponse response = client.execute(httpGet);
                    inputStream = response.getEntity().getContent();

                    if (inputStream != null) {
                        result = convertInputStreamToString(inputStream) + "=" + params[1];
                    } else
                        result = null;

                    return result;

                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                    System.err.println("Chyba " + e.getMessage());
                } catch (IOException e) {
                    e.printStackTrace();
                    System.err.println("Chyba2 " + e.getMessage());
                }
            }
        }

        return null;
    }

    @Override
    protected void onPostExecute(String dataFetched) {
        if(dataFetched != null) {
            String[] dataFetched1 = dataFetched.split("=");
            parseJSON(dataFetched1[0], Integer.valueOf(dataFetched1[1]));
        }
    }

    private String convertInputStreamToString(InputStream inputStream) throws IOException{
        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
        String line = "";
        String result = "";
        while((line = bufferedReader.readLine()) != null)
            result += line;

        inputStream.close();
        return result;
    }

    private void parseJSON(String data, int id){
        try{
            JSONObject jsonObject = new JSONObject(data);

            remoteViews.setTextViewText(R.id.widgetTeplotaVenku, context2.getString(R.string.outside) + ":\n" + jsonObject.getString("temp_out") + " °C");
            remoteViews.setTextViewText(R.id.widgetTeplotaDoma, context2.getString(R.string.inside) + ":\n" + jsonObject.getString("temp_in") + " °C");

            appWidgetManager2.updateAppWidget(id, remoteViews);
        }catch(Exception e){
            Log.i("App", "Error parsing data " +e.getMessage());
        }
    }
}}

И настройки виджетов:

public class WidgetSettings extends Activity {

EditText widget_text_edit;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.widget_settings);

    System.err.println("ID: " + getIntent().getIntExtra("widget_id", 0));
    String test = getIntent().getStringExtra("widget_name");
    widget_text_edit = findViewById(R.id.widget_text_edit);
    widget_text_edit.setText(test);

    Button button = findViewById(R.id.widget_settings_button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
            widget_testConfigureActivity.saveTitlePref(getApplicationContext(), getIntent().getIntExtra("widget_id", 0), String.valueOf(widget_text_edit.getText()));
            widget_test.updateAppWidget(getApplicationContext(), appWidgetManager, getIntent().getIntExtra("widget_id", 0));

            finish();
        }
    });
}}

Кто-нибудь есть идеи, как это исправить?Спасибо

PS: Извините за мой плохой английский.

1 Ответ

0 голосов
/ 26 октября 2018

Я исправляю одну проблему, но эта проблема все еще сохраняется.Новый код:

public class widget_test extends AppWidgetProvider {

public static String CLOCK_WIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE";

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                            int appWidgetId) {

    CharSequence widgetText = widget_testConfigureActivity.loadTitlePref(context, appWidgetId);

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_test);

    views.setTextViewText(R.id.appwidget_text, widgetText);

    String adresa = widget_testConfigureActivity.loadAdresaPref(context, appWidgetId).toString();
    new FetchDataTask(views, appWidgetManager, context).execute(adresa, String.valueOf(appWidgetId));

    System.err.println("ID: " + appWidgetId);

    Intent configIntent = new Intent(context, WidgetSettings.class);
    configIntent.putExtra("widget_id", appWidgetId);
    configIntent.putExtra("widget_name", widgetText);
    PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    views.setOnClickPendingIntent(R.id.widget_button_setting, configPendingIntent);

    appWidgetManager.updateAppWidget(appWidgetId, views);
}

public static boolean isConnected(Context context){
    ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected())
        return true;
    else
        return false;
}

public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    if (CLOCK_WIDGET_UPDATE.equals(intent.getAction())) {
        Date datum = new Date();
        if(datum.getMinutes() % 5 == 0) {
            ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
            int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
            for (int appWidgetID : ids) {
                System.err.println("UPDATE!");
                updateAppWidget(context, appWidgetManager, appWidgetID);
            }
        }
    }
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    // There may be multiple widgets active, so update all of them
    for (int appWidgetId : appWidgetIds) {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }
}

@Override
public void onDeleted(Context context, int[] appWidgetIds) {
    // When the user deletes the widget, delete the preference associated with it.
    for (int appWidgetId : appWidgetIds) {
        widget_testConfigureActivity.deleteTitlePref(context, appWidgetId);
        widget_testConfigureActivity.deleteAdresaPref(context, appWidgetId);
    }
}

@Override
public void onEnabled(Context context) {
    // Enter relevant functionality for when the first widget is created
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 1);
    alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 60000, createClockTickIntent(context));

    ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
    for (int appWidgetId : ids) {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }
}

private PendingIntent createClockTickIntent(Context context) {
    Intent intent = new Intent(CLOCK_WIDGET_UPDATE);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    return pendingIntent;
}

private PendingIntent createClockTickIntentCancel(Context context) {
    System.err.println("Cancel");
    Intent intent = new Intent(CLOCK_WIDGET_UPDATE);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    return pendingIntent;
}


@Override
public void onDisabled(Context context) {
    // Enter relevant functionality for when the last widget is disabled
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(createClockTickIntentCancel(context));
}

private static class FetchDataTask extends AsyncTask<String, Void, String> {

    private RemoteViews views;
    private AppWidgetManager manager;
    private Context context;

    public FetchDataTask(RemoteViews views, AppWidgetManager manager, Context context){
        this.views = views;
        this.manager = manager;
        this.context = context;
    }

    @Override
    protected String doInBackground(String... params) {
        if(isConnected(context)) {
            InputStream inputStream = null;
            String result = null;
            HttpClient client = new DefaultHttpClient();
            if (!params[0].equals("null")) {
                HttpGet httpGet = new HttpGet(params[0]);
                try {
                    HttpResponse response = client.execute(httpGet);
                    inputStream = response.getEntity().getContent();

                    if (inputStream != null) {
                        result = convertInputStreamToString(inputStream) + "=" + params[1];
                    } else
                        result = null;

                    return result;

                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                    System.err.println("Chyba " + e.getMessage());
                } catch (IOException e) {
                    e.printStackTrace();
                    System.err.println("Chyba2 " + e.getMessage());
                }
            }
        }

        return null;
    }

    @Override
    protected void onPostExecute(String dataFetched) {
        if(dataFetched != null) {
            String[] dataFetched1 = dataFetched.split("=");
            parseJSON(dataFetched1[0], Integer.valueOf(dataFetched1[1]));
        }
    }

    private String convertInputStreamToString(InputStream inputStream) throws IOException{
        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
        String line = "";
        String result = "";
        while((line = bufferedReader.readLine()) != null)
            result += line;

        inputStream.close();
        return result;
    }

    private void parseJSON(String data, int id){
        try{
            JSONObject jsonObject = new JSONObject(data);

            views.setTextViewText(R.id.widgetTeplotaVenku, context.getString(R.string.outside) + ":\n" + jsonObject.getString("temp_out") + " °C");
            views.setTextViewText(R.id.widgetTeplotaDoma, context.getString(R.string.inside) + ":\n" + jsonObject.getString("temp_in") + " °C");

            manager.updateAppWidget(id, views);
        }catch(Exception e){
            Log.i("App", "Error parsing data " +e.getMessage());
        }
    }
}}

И:

public class WidgetSettings extends Activity {

EditText widget_text_edit;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.widget_settings);

    System.err.println("ID: " + getIntent().getIntExtra("widget_id", 0));
    String test = getIntent().getStringExtra("widget_name");
    widget_text_edit = findViewById(R.id.widget_text_edit);
    widget_text_edit.setText(test);

    Button button = findViewById(R.id.widget_settings_button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
            widget_testConfigureActivity.saveTitlePref(getApplicationContext(), getIntent().getIntExtra("widget_id", 0), String.valueOf(widget_text_edit.getText()));
            widget_test.updateAppWidget(getApplicationContext(), appWidgetManager, getIntent().getIntExtra("widget_id", 0));

            finish();
        }
    });
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...