Android: Как обновить textView во фрагменте
Я пытаюсь использовать фрагменты для создания моего первого правильного приложения для Android. У меня есть основной xml. который состоит из двух вертикальных фрагментов, верхние фрагменты состоят всего из двух TextViews. Первый из них содержит статический текст, а второй содержит значение, которое я в конечном итоге буду получать динамически из SQL.
Если я поставлю это моя основная активность.затем java с радостью обновляет значение TextView в моем первом фрагменте:
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");
}
у меня есть два фрагмента XMLs и java для поддержки каждого, поэтому я хочу поместить настройку этого поля в Java, который поддерживает фрагмент, а не java, который предназначен для MainActivity.
когда я помещаю его в Фрагмент, он выглядит так: -
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");
}
но если я это сделаю, я получу ошибку в строке TextView:
"метод findViewById (int) не определен для типа FragmentMainTop"
Так почему же он не знает этого метода? Я ЦТЛ/смену/o так я знаю, что у меня все правильный импорт. Я не хочу в конечном итоге помещать весь свой код в MainActivity, потому что если я хочу использовать фрагмент в другом действии, мне придется повторить весь код.
3 ответов
вам нужно назначить надутый макет фрагмента переменной, чтобы вы могли получить доступ к его findViewById()
метод. Затем вы возвращаете его, как только закончите обновление виджетов.
@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;
}
обычно, когда вы называете findViewById()
внутри Activity
, вы вызываете Activity.findViewById()
. Попытка того же вызова в вашем Fragment
класс потерпит неудачу, потому что нет такого Fragment.findViewById()
метод. Итак, вы должны использовать View.findViewById()
с надутым видом, чтобы получить ссылки на ваши виджеты.
Я не эксперт, но я бы сказал, что оператор return в методе возвращает что-то, и следующие строки после этого оператора недоступны :O
поэтому попробуйте изменить порядок! :)
Я использую этот код из моей деятельности для обновления textview, добавленного в XML-тег. Textview-это объекты уровня класса. Вот код:
<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" />
Heres код фрагмента просто показывает переменную уровня класса.
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
}
}
Теперь действие, из которого я обновляю свой фрагмент:
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");
}
});
}
}
Примечание: не уверен, что это хороший способ.