Autore Topic: screen widget, intent e main activity  (Letto 283 volte)

Offline brax

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus 3T
  • Sistema operativo:
    Win 10
screen widget, intent e main activity
« il: 06 Giugno 2017, 01:00:37 CEST »
0
ciao, sto sviluppando la mia prima app (editare un file txt). la main activity funziona correttamente e quello che mi interessa fare ora è aggiungere un widget da mettere sullo schermo. Seguendo tutorial ecc ho creato la activity per il widget (con un paio di buttons) ed è funzionante.
Quello che non riesco a capire è come usare i buttons del widget per interagire con la main activity (quindi editare il file di testo) SENZA aprire l'app. In pratica vorrei capire se, dal widget, posso chiamare un metodo della main activity senza che parta tutta l'app.

Ho visto qualche tutorial sugli intent ma nessuno che:
1) abbia il widget nella home
2) non faccia partire tutta l'altra activity

Immagino che essendo l'application semplice potrei forse riscrivere direttamente i metodi della main all'interno del widget e andando a modificare lo stesso file, ma vorrei prima capire qual'è il metodo corretto per proseguire

grazie :)

Offline iClaude

  • Utente normale
  • ***
  • Post: 237
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:screen widget, intent e main activity
« Risposta #1 il: 06 Giugno 2017, 11:27:58 CEST »
0
Le Activity in Android servono tipicamente per gestire la UI.
Per altre operazioni è preferibile creare delle classi separate. Nel tuo caso mi pare di capire che hai del codice comune tra il widget e la main activity, quindi a maggiore ragione è preferibile metterlo in una classe a parte (che tra l'altro è anche meglio per il testing).

Offline brax

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus 3T
  • Sistema operativo:
    Win 10
Re:screen widget, intent e main activity
« Risposta #2 il: 07 Giugno 2017, 00:29:50 CEST »
0
ciao e grazie! Effettivamente ha senso..un'altra domanda..nella widgetactivity la chiamata ai metodi della mia classe la metto nel onUpdate?

Offline iClaude

  • Utente normale
  • ***
  • Post: 237
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:screen widget, intent e main activity
« Risposta #3 il: 07 Giugno 2017, 08:38:31 CEST »
0
ciao e grazie! Effettivamente ha senso..un'altra domanda..nella widgetactivity la chiamata ai metodi della mia classe la metto nel onUpdate?

onUpdate viene chiamato in automatico quando il widget deve essere aggiornato ogni tot millisecondi specificati in AppWidgetProviderInfo.
Nel tuo caso mi sembrava che dovevi cliccare su un bottone, quindi dovresti aggiungere un listener al bottone.

Offline brax

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus 3T
  • Sistema operativo:
    Win 10
Re:screen widget, intent e main activity
« Risposta #4 il: 07 Giugno 2017, 12:35:39 CEST »
0
giusto, mi ero confuso. Ok ho scritto la mia classe e di base funziona ma ho un problema con la scrittura su file (quando lo stesso codice era nel main activity funzionava) e non sono sicuro se il problema sia il context o altro.

questo è l'errore

grazie! :)

Codice: [Seleziona]
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileOutputStream android.content.Context.openFileOutput(java.lang.String, int)' on a null object reference
                                                                               at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:193)
                                                                               at com.example.fran.textfile.Counter.writeData(Counter.java:76)
                                                                               at com.example.fran.textfile.Counter.insertData(Counter.java:39)
                                                                               at com.example.fran.textfile.MainActivity.btnInsertData(MainActivity.java:31)
                                                                               at java.lang.reflect.Method.invoke(Native Method) 

nella mia classe custom, questo è il mio metodo per scrivere sul file

Codice: [Seleziona]
public void writeData(int value) {
        try {
            FileOutputStream file = null;
           
            try {
                file = openFileOutput("Data.txt", MODE_PRIVATE);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            OutputStreamWriter outputFile = new OutputStreamWriter(file);
           
            try {
                outputFile.write(String.valueOf(value));
            } catch (IOException e) {
                e.printStackTrace();
            }
           
            try {
                outputFile.flush(); //secure all bytes are written to the file
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                outputFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
           
            //Toast.makeText(context, "Successfully saved!", Toast.LENGTH_SHORT).show();
        } catch (IOError e) {
            //Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }

Offline iClaude

  • Utente normale
  • ***
  • Post: 237
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:screen widget, intent e main activity
« Risposta #5 il: 07 Giugno 2017, 13:26:51 CEST »
0
openFileOutput è un metodo di Context: lo puoi richiamare da una Activity (che è un Context), non da una classe Java normale.
Devi passargli un Context e richiamare il metodo su di esso.

Cmq il metodo migliore sarebbe creare un Service per gestire la scrittura su file.

Offline brax

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus 3T
  • Sistema operativo:
    Win 10
Re:screen widget, intent e main activity
« Risposta #6 il: 07 Giugno 2017, 22:31:06 CEST »
0
grazie ancora per l'aiuto. errore mio che non ho incluso tutto il codice. Sto passando il context alla mia classe (dal Main Activity). Per ora lascerei stare i service perchè rischio di incasinarmi ancora di più :D

questo è il mio costruttore

Codice: [Seleziona]
public class MyClass extends AppCompatActivity {
   
    private int value;
    private Context context;
   
    public MyClass (Context context){
        this.context = context;
        value = 0;
    }

e nella MainAcitvity

Codice: [Seleziona]
public class MainActivity extends AppCompatActivity {

    public MyClass myObject;
   
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myObject = new MyClass(MainActivity.this);

grazie! :)

Post unito: 07 Giugno 2017, 23:04:24 CEST
ok, non avevo chiamato il metodo sul context. Perfetto ora funziona! Grazie mille intanto! Ora provo a fare lo stesso con il widget!
Grazie!!! :)
« Ultima modifica: 07 Giugno 2017, 23:04:24 CEST da brax, Reason: Merged DoublePost »

Offline iClaude

  • Utente normale
  • ***
  • Post: 237
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:screen widget, intent e main activity
« Risposta #7 il: 07 Giugno 2017, 23:17:54 CEST »
0
Non serve che MyClass estenda AppCompatActivity, perché non è una Activity.
Crea una normale classe Java.

Offline brax

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    OnePlus 3T
  • Sistema operativo:
    Win 10
Re:screen widget, intent e main activity
« Risposta #8 il: 10 Giugno 2017, 02:16:35 CEST »
0
giusto, l'avevo messo mentre cercavo di capire la causa degli errori e l'ho dimenticato.
Dunque, sto cercando di fare il mio widget..ho trovato pochissimi tutorial che vadano al di là della semplice generazione del widget. Seguendo un tutorial che sembra fare una cosa simile a quello che serve a me, ho il codice seguente che non funziona (il widget non viene neanche più mostrato "Couldn't add widget"). Sto ancora cercando di capire cosa stia facendo effettivamente il codice. Se hai suggerimenti o qualche esempio da suggerire ne sarei felice :)

Codice: [Seleziona]
public class Widget extends AppWidgetProvider {
   
    public MyClass myObject;   
    private static final String SYNC_CLICKED = "WidgetImageClick";
   
    public int widBtnInsertData() {
        myObject.insertData();
        return myObject.getValue();
    }
   
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
 
        RemoteViews views;
        ComponentName componentName;
       
        views = new RemoteViews(context.getPackageName(), R.layout.widget);
        componentName = new ComponentName(context, Widget.class);
       
        views.setTextViewText(R.id.widBtnRst, String.valueOf(widBtnInsertData()));
   
        views.setOnClickPendingIntent(R.id.widBtnIns, getPendingSelfIntent(context, SYNC_CLICKED));
        appWidgetManager.updateAppWidget(componentName, views);
    }
   
    protected PendingIntent getPendingSelfIntent(Context context, String action){
       
        Intent intent = new Intent(context, getClass());
        intent.setAction(action);       
        return PendingIntent.getBroadcast(context, 0, intent, 0);
    }
   
    @Override
    public void onReceive(Context context, Intent intent){
        super.onReceive(context, intent);
   
        if(SYNC_CLICKED.equals(intent.getAction())){
            RemoteViews views;
            ComponentName componentName;
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
           
            views = new RemoteViews(context.getPackageName(), R.layout.widget);
            componentName = new ComponentName(context, Widget.class);
   
            views.setTextViewText(R.id.widBtnRst, String.valueOf(widBtnInsertData()));

            appWidgetManager.updateAppWidget(componentName, views);
        }
    }
}

Offline iClaude

  • Utente normale
  • ***
  • Post: 237
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:screen widget, intent e main activity
« Risposta #9 il: 15 Giugno 2017, 13:03:09 CEST »
0
Dovresti circoscrivere il punto in cui si genera l'errore.
Se non lo vedi nei log prova x esclusione commentando le parti di codice sospette.