Android: Как обновить свой TextView в фрагменте - программирование
Подтвердить что ты не робот

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, потому что, если я захочу использовать фрагмент в другом упражнении, мне придется повторить весь код.

4b9b3361

Ответ 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");


        }
    });
}
}

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