2014-04-04 7 views
12

In MainActivity ho un TextView: textV1. Ho anche un metodo in MainActivity che aggiorna che TextView:Android BroadcastReceiver onReceive Aggiorna TextView in MainActivity

public void updateTheTextView(final String t) { 
    MainActivity.this.runOnUiThread(new Runnable() { 
     public void run() { 
      TextView textV1 = (TextView) findViewById(R.id.textV1); 
      textV1.setText(t); 
     } 
    }); 
} 

In un BroadcasrReceiver ho bisogno di aggiornare il testo in textV1 in MainActivity.

public class NotifAlarm extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
      // other things done here like notification 

      // NEED TO UPDATE TEXTV1 IN MAINACTIVITY HERE 
    } 
} 

Come può essere fatto? BroadcastReceiver viene eseguito da un servizio. Questo codice non posso cambiare. Posso accedere e modificare textV1 in MainActivity da onReceive()? Ho provato molte cose ma tutte falliscono.

+0

Basta prendere una corda statica e quindi conservare questo il risultato di textview e l'accesso in questa classe. – InnocentKiller

+0

Grazie per la risposta InnocentKiller. Scusa, non sono sicuro di cosa intendi. Puoi spiegare per favore? Apprezzo l'aiuto. – user3499199

+1

Dichiarare una variabile di stringa statica all'interno di MainActivity e quindi memorizzare il valore della propria vista testo all'interno di quella stringa e quindi è possibile utilizzare tale stringa in qualsiasi classe. – InnocentKiller

risposta

31

Nel tuo MainActivity inizializza una variabile della classe MainActivity come di seguito.

public class MainActivity extends Activity { 
    private static MainActivity ins; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ins = this;  
    } 

    public static MainActivity getInstace(){ 
     return ins; 
    } 

    public void updateTheTextView(final String t) { 
     MainActivity.this.runOnUiThread(new Runnable() { 
      public void run() { 
       TextView textV1 = (TextView) findViewById(R.id.textV1); 
       textV1.setText(t); 
      } 
     }); 
    } 
} 


public class NotifAlarm extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     try { 
      MainActivity .getInstace().updateTheTextView("String"); 
     } catch (Exception e) { 

     }   
    } 
} 
+0

getInstace() non funziona in broadcastreceiver: MainActivity .getInstace(). updateTheTextView ("String"); Non so getinstance – user3499199

+0

solo in MainActivity creare questo metodo e ho anche aggiornato la risposta. – User10001

+0

Tu, InnocentKiller e ashish, sei fantastico! Funziona perfettamente. Grazie mille. – user3499199

2

creare un'istanza della classe e poi passare il valore alla funzione che cambia il valore TextView attenersi alla seguente procedura per favore: nel vostro BroadcastReceiver Override OnReceive metodo e incolla Queste linee o modifiche tema come si desidera

private Handler handler = new Handler(); // Handler used to execute code on the UI thread 
// Post the UI updating code to our Handler 
handler.post(new Runnable() { 
    @Override 
    public void run() { 
    //Toast.makeText(context, "Toast from broadcast receiver", Toast.LENGTH_SHORT).show(); 
    YourActivityToUpdate.updateTheTextView(message); 
    YourActivityToUpdateinst = YourActivityToUpdate.instance(); 
     if(inst != null) { // your activity can be seen, and you can update it's context 
     inst.updateTheTextView(message); 
     } 
    } 
}); 

ora ci spiegano l'updateTheTextView e inst in classe YourActivityToUpdate incollare questi Lines piacimento

private static SignUpVerify mInst; 

public static SignUpVerify instance() { 
     return mInst; 
} 
@Override 
public void onStart() { 
    super.onStart(); 
    mInst = this; 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    mInst = null; 
} 

e questo è il metodo updateTheTextView che dovrebbe essere collocato in classe YourActivityToUpdate

public void updateTheTextView(final String verifyCodeValue) { 
       Log.i("verifyCodeValue", verifyCodeValue); 
       YourTextViewToUpdate.setText(verifyCodeValue); 
    } 

Credo che questo sia un modo migliore grazie alla "kevin-lynx"