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


        }
    });
}
}

Примечание: не уверен, что это хороший способ.