2013-03-10 3 views
14

Sto cercando di utilizzare i frammenti per creare la mia prima app Android appropriata. Ho un XML principale. che consiste di due frammenti verticali, i frammenti in alto sono costituiti da due soli TextView. Il primo di questi contiene il testo statico e il secondo contiene un valore che alla fine otterrò in modo dinamico da SQL.Android: Come aggiornare il mio testo Visualizza in un frammento

Se metto questo è il mio MainActivity.java allora aggiorna felicemente il valore del TextView nel mio primo frammento:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    // Set the Text to try this out 
    TextView t = (TextView)findViewById(R.id.viewItem); 
    t.setText("Text to Display"); 
} 

Ho due XMLs frammento e Java per supportare ogni modo voglio mettere l'impostazione di questo campo in Java che supporta il frammento anziché il java che è per MainActivity.

quando ho messo nel frammento che assomiglia a questo: -

public class FragmentMainTop extends Fragment { 
@Override 
public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState){ 
    // -- inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragmentmt, container,false); 

    // Set the Text to try this out 
    TextView t = (TextView)findViewById(R.id.viewItem); 
    t.setText("Text to Display"); 
} 

Ma se faccio questo io ottenere un errore sulla linea TextView:

"Il metodo findViewById (int) è indefinito per il tipo FragmentMainTop "

Quindi perché non conosce questo metodo? Ho ctl/shift/o quindi so di avere tutte le importazioni giuste. Non voglio finire per mettere tutto il mio codice in MainActivity perché se voglio usare il Frammento in un'altra attività dovrò ripetere tutto il codice.

risposta

45

È necessario assegnare il layout del frammento gonfiato a una variabile in modo da poter accedere al relativo metodo findViewById(). Quindi lo restituisci una volta che hai finito di aggiornare i tuoi widget.

@Override 
public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState){ 
    // -- inflate the layout for this fragment 
    View myInflatedView = inflater.inflate(R.layout.fragmentmt, container,false); 

    // Set the Text to try this out 
    TextView t = (TextView) myInflatedView.findViewById(R.id.viewItem); 
    t.setText("Text to Display"); 

    return myInflatedView; 
} 

Normalmente, quando si chiama findViewById() all'interno di un Activity, si sta invocando Activity.findViewById(). Provare la stessa chiamata all'interno della classe Fragment avrà esito negativo perché non esiste un tale metodo Fragment.findViewById(). Quindi, devi usare View.findViewById() con la tua vista gonfiata per ottenere riferimenti ai tuoi widget.

+0

I riferimenti vengono restituiti correttamente anche quando trovoViewByID sull'attività restituita da fragment.getActivity(). Ma l'aggiornamento dinamico delle viste continua a non funzionare –

2

Io non sono un esperto, ma direi che istruzione return all'interno di un metodo restituisce qualcosa e le prossime righe dopo questa dichiarazione sono irraggiungibili: O

Quindi provare a cambiare l'ordine! :)

0

Sto utilizzando questo codice dalla mia attività per aggiornare una vista testuale aggiunta nel tag xml. La textview è oggetti di livello di classe. Ecco qualche codice:

<fragment 
    android:id="@+id/fragmentRegister" 
    android:name="com.proshore.loveis.RegisterFragment" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/view1" /> 

Ecco il codice del frammento che mostra solo la variabile di livello di classe.

public class RegisterFragment extends Fragment implements OnClickListener { 

TextView textViewDOB, textViewLanguage; 

public RegisterFragment() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
//eluded methods here 
} 
} 

Ora l'attività dal punto in cui aggiorno il mio frammento:

public class RegisterActivity extends FragmentActivity { 
Button buttonEnter; 
RegisterFragment fragmentRegister; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_register); 
    buttonEnter = (Button) findViewById(R.id.buttonEnter); 
    fragmentRegister = (RegisterFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.fragmentRegister); 
} 

@Override 
protected void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 
    buttonEnter.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Log.d("dontknowitwillowrk", fragmentRegister.textViewLanguage 
        .getText().toString()); 
      fragmentRegister.textViewLanguage.setText("hello mister how do you do"); 


     } 
    }); 
} 
} 

Nota: non so se questo è un buon modo.