Android: Как обновить свой TextView в фрагменте
Я пытаюсь использовать фрагменты для создания своего первого подходящего приложения для Android.
У меня есть основной xml. который состоит из двух вертикальных фрагментов, верхние фрагменты состоят всего из двух TextView. Первый из них содержит статический текст, а второй содержит значение, которое я в конечном итоге получаю динамически из SQL.
Если я ставлю это мой MainActivity.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");
}
У меня есть два фрагмента XML и 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) undefined для типа FragmentMainTop"
Так почему он не знает этот метод? У меня есть ctl/shift/o, поэтому я знаю, что у меня есть все необходимые импорты.
Я не хочу вставлять весь свой код в MainActivity, потому что, если я захочу использовать фрагмент в другом упражнении, мне придется повторить весь код.
Ответы
Ответ 1
Вам нужно назначить раздутую структуру фрагмента переменной, чтобы вы могли получить доступ к ее методу 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()
с вашим раздутым представлением, чтобы получить ссылки на ваши виджеты.
Ответ 2
Я не эксперт, но я бы сказал, что оператор return в методе возвращает что-то, а следующие строки после этого утверждения недостижимы: O
Поэтому попробуйте изменить порядок!:)
Ответ 3
Я использую этот код из своей активности, чтобы обновить текстовое представление, добавленное в тег xml. Текстовые объекты представляют собой объекты уровня класса. Вот какой код:
<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" />
Вот фрагмент кода, который показывает переменную уровня класса.
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");
}
});
}
}
Примечание. Не уверен, что это хороший способ.