2013-03-10 17 views
14

Próbuję użyć fragmentów do zbudowania mojej pierwszej właściwej aplikacji na Androida. Mam główny xml. który składa się z dwóch pionowych fragmentów, górne fragmenty składają się z zaledwie dwóch widoków tekstowych. Pierwszy z nich zawiera tekst statyczny, a drugi zawiera wartość, którą ostatecznie otrzymam dynamicznie z SQL.Android: Jak zaktualizować tekst w Fragmentie

jeśli mogę umieścić to moja MainActivity.java to szczęśliwie aktualizuje wartość TextView w moim pierwszym Fragment:

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"); 
} 

Mam dwóch fragmentów plików XML i Java, aby wspierać się wzajemnie tak chcę umieścić ustawienie tego pola na język Java, który obsługuje fragment, a nie java, które jest dla głównego obiektu.

Kiedy umieścić go we fragmencie wygląda to tak: -

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"); 
} 

Ale jeśli mogę to zrobić pojawia się błąd na linii TextView:

„Metoda findViewById (int) jest nieokreślony dla typu FragmentMainTop "

Dlaczego więc nie zna tej metody? Mam ctl/shift/o, więc wiem, że mam wszystkie właściwe produkty importowane. Nie chcę w końcu umieszczać całego mojego kodu w MainActivity, ponieważ jeśli chcę użyć Fragmentu w innym działaniu, będę musiał powtórzyć cały kod.

Odpowiedz

45

Należy przypisać układ zawężonego fragmentu do zmiennej, aby uzyskać dostęp do jej metody findViewById(). Następnie zwracasz go, gdy skończysz aktualizować swoje widżety.

@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; 
} 

Normalnie, kiedy zadzwonić findViewById() ramach Activity, jesteś powołując Activity.findViewById(). Wypróbowanie tego samego połączenia w klasie Fragment zakończy się niepowodzeniem, ponieważ nie ma takiej metody Fragment.findViewById(). Tak więc musisz użyć View.findViewById() w swoim zawyżonym widoku, aby uzyskać odniesienia do twoich widżetów.

+0

Odniesienia są zwracane pomyślnie, nawet jeśli findViewByID na działanie zwrócone przez fragment.getActivity(). Jednak aktualizacja widoków wciąż nie działa –

2

Nie jestem ekspertem, ale chciałbym powiedzieć, że oświadczenie zwrot w sposobie powraca coś i kolejne linie po tym oświadczeniu jest nieosiągalny: O

Więc spróbuj zmienić kolejność! :)

0

Używam tego kodu z mojej działalności, aby zaktualizować tekst dodany w tagu xml. Widok tekstowy to obiekty na poziomie klasy. Oto kod:

<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" /> 

Oto fragment kodu pokazujący tylko zmienną poziomu klasy.

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 
} 
} 

Teraz aktywność skąd zaktualizować fragment:

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"); 


     } 
    }); 
} 
} 

Uwaga: nie wiem, czy to jest dobry sposób.

Powiązane problemy