Autore Topic: Modificare TextView di un layout esterno  (Letto 317 volte)

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Modificare TextView di un layout esterno
« il: 23 Giugno 2016, 17:11:04 CEST »
0
Ciao a tutti, ho la necessità di modificare da un'activity una textview presente in un layout diverso da quello inserito nel setContentView, ma qualunque cosa provi a fare ottengo un nullpointerException.
Sapreste dirmi come è possibile modificare layout dall'esterno?

Questo è il codice, in sostanza lavoro con diverse componenti perché è un navigation layout.
Ignorate magari la prima parte e andate a metà sezione sull'Intent.

Codice: [Seleziona]
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_home);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);



        //recupero una stringa da un'altra activity

        Intent i=getIntent();
        Bundle extras = getIntent().getExtras();
        String username=extras.getString("nomeutente");

        LinearLayout l=(LinearLayout)findViewById(R.id.layoutinfo); //recupero il layout esterno

        TextView textViewToChange = (TextView)l.findViewById(R.id.nomeprofilo);
        textViewToChange.setText(username);//qui ho il nullpointerException

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 583
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Modificare TextView di un layout esterno
« Risposta #1 il: 23 Giugno 2016, 18:34:35 CEST »
0
In breve: non è possibile.

Se hai bisogno di accedere ad un layout esterno a quello della tua Activity, probabilmente c'è un errore di progettazione.

Il metodo corretto di affrontare la situazione consiste nella condivisione del testo da parte dell'Activity/Fragment esterno, in modo che la tua possa prelevarlo senza andare a leggerlo.

Un'idea può essere quella di estendere la classe Application ed esporla tramite singleton, in modo da poter scrivere lì i tuoi valori.

Esempio:

Codice (Java): [Seleziona]
public class MiaApplication extends Application {
  private MiaApplication _instance = null;
  private String _testoCondiviso = null;

  @Override
  public void onCreate() {
    super.onCreate();
    _instance = this;
  }

  public static MiaApplication getInstance() {
    return _instance;
  }

  public String getTestoCondiviso() {
    return _testoCondiviso;
  }

  public void setTestoCondiviso(String testo) {
    _testoCondiviso = testo;
  }
}

Poi, dalla tua prima activity, puoi fare:
Codice (Java): [Seleziona]
MiaApplication.getInstance().setTestoCondiviso(textView.GetText().ToString());
E dalla tua seconda activity:

Codice (Java): [Seleziona]
String testo = MiaApplication.getInstance().getTestoCondiviso();
In alternativa puoi inviare in messaggio dalla prima alla seconda activity tramite intent, ma in questo caso la situazione si complica perché:

- Devi dichiarare un IntentReceiver
- Devi farlo registrare dall'Activity che intende ricevere i dati
- Devi inoltrare un'Intent da parte dell'activity che vuole inviare i dati
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Modificare TextView di un layout esterno
« Risposta #2 il: 23 Giugno 2016, 23:21:47 CEST »
0
In realtà io ho un layout solo, quello nel codice dove faccio la setcontentview che contiene altri layout come fragment, quindi il layout secondario sarebbe già incluso li dentro, però non riesco ad accedere alla textview del layout secondario e modificarla.... :-(

Non posso usare la prima soluzione perchè non è concessa l'ereditarietà multipla e la classe già ne estende un'altra.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 583
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Modificare TextView di un layout esterno
« Risposta #3 il: 24 Giugno 2016, 00:02:08 CEST »
0
Se il "layout secondario" è un Fragment contenuto nell'activity è ancora più facile.

Puoi utilizzare il metodo descritto qui:

https://developer.android.com/training/basics/fragments/communicating.html

per passare dati tra Fragment ad Avtivity e viceversa.

Nel tuo fragment implementi un metodo che scrive sulla textview:

Codice (Java): [Seleziona]
public class MioFragment extends Fragment {

  //...

  public void setUsername(String username) {
    TextView textViewToChange = (TextView)findViewById(R.id.nomeprofilo);
    textViewToChange.setText(username);
  }

  //...

}

e nell'activity:

Codice (Java): [Seleziona]
MioFragment frag =
  (MioFragment)getSupportFragmentManager().findFragmentById(R.id.mio_fragment);

frag.setUsername(username);
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Modificare TextView di un layout esterno
« Risposta #4 il: 24 Giugno 2016, 11:45:08 CEST »
0
Emh, si in effetti hai ragione, perdonami ma mi sono espresso malissimo, visto l'orario di ieri XD
In verità la situazione è questa, ho un NavigationView che come layout ha questo layout secondario di cui parlo che si chiama nav_heaader_user_home, che contiene la TextView :

Codice: [Seleziona]
<android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:menu="@menu/activity_user_home_drawer"
            app:headerLayout="@layout/nav_header_user_home">

        </android.support.design.widget.NavigationView>

Non riesco a modificare la TextView lì dentro, è possibile farlo se non ho un Fragment con associato quel secondo layout? Altrimenti l'unica soluzione che mi viene in mente è quella di creare un'activity che abbia come view il layout secondario creare il metodo come dicevi tu e forse richiamarlo dall'activity primaria?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 583
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Modificare TextView di un layout esterno
« Risposta #5 il: 24 Giugno 2016, 12:04:17 CEST »
0
Allora l'unica possibilità che mi viene in mente è che sia sbagliato il nome della textView che stai cercando di recuperare.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Darèios89

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
Re:Modificare TextView di un layout esterno
« Risposta #6 il: 29 Giugno 2016, 23:58:54 CEST »
0
Risolto caricando dinamicamente il layout con Inflater.