Как изменить текст фрагмента textView из активности
Я не могу найти, как изменить фрагмент textview
с Activity
. У меня есть 4 файла:
MainActivity.java
activity_main.xml
FragmentClass.java
frag_class.xml
frag_class.xml имеет textView, я хочу изменить текст из MainActivity.java.
FragmentClass расширяет фрагмент, этот фрагмент отображается в MainActivity
FragmentClass имеет:
public void changeText(String text){
TextView t = (TextView) this.getView().findViewById(R.id.tView);
t.setText(text);
}
и в MainActivity я попробовал это:
FragmentClass fc = new FragmentClass();
fc.changeText("some text");
Но, к сожалению, этот код дает мне NullPointerException в fc.changeText("some text");
Я также попытался изменить текст непосредственно из MainActivity с помощью:
TextView t = (TextView) this.getView().findViewById(R.id.tView);
t.setText(text);
который не удалось выполнить.
[EDIT]
Полный код здесь
Ответы
Ответ 1
Ответ @Lalit правильный, но я вижу, что вам не нужно создавать такую функцию, как fragment_obj.updateTextView();. Я установил все свои представления как объекты уровня класса и смог напрямую обновить текстовое окно.
fragmentRegister.textViewLanguage.setText("hello mister how do you do");
Примечание. Если вам нужно выполнить более одного действия, то функция будет способом.
Ответ 2
Вы можете найти экземпляр фрагмента, используя
Для библиотеки поддержки
YourFragment fragment_obj = (YourFragment)getSupportFragmentManager().
findFragmentById(R.id.fragment_id);
else
YourFragment fragment_obj = (YourFragment)getFragmentManager().
findFragmentById(R.id.fragment_id);
Затем создайте метод в Фрагменте, который обновит ваш TextView
и вызовет этот метод, используя fragment_obj
like,
fragment_obj.updateTextView();
Ответ 3
От activity
до Fragment
на Fragment Transaction
:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public static void changeFragmentTextView(String s) {
Fragment frag = getFragmentManager().findFragmentById(R.id.yourFragment);
((TextView) frag.getView().findViewById(R.id.textView)).setText(s);
}
}
Ответ 4
Я сделал это по-другому. У меня приложение работает следующим образом:
После запуска моего приложения у меня есть MainActivity с созданным HomeFragment. В HomeFragment у меня есть Button и TextView для подключения/отображения состояния BluetoothConnection.
В HomeFragment я реализовал обработчик для получения информации от BluetoothService. После получения сообщения я хотел обновить TextView и текст Button. Я создал публичный интерфейс в HomeFragment с помощью метода, который получает аргументы String для TextView и Button. В onAttach (Activity a) я создал объект mCallback для обсуждения активности.
Следующий шаг реализует этот интерфейс в MainActivity. Из этого действия я обновляю TextView и Button. Все выглядит так:
HomeFragment.java
public interface ViewInterface{
public void onViewUpdate(String buttonTxt, String txtTxt);
}
@Override
public void onAttach(Activity a){
super.onAttach(a);
try{
mCallback = (ViewInterface)a;
}catch (ClassCastException e){
e.printStackTrace();
}
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_STATE_CHANGE:
if(true) Log.i(CLASS_TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);
switch (msg.arg1) {
case BluetoothConnectionService.STATE_CONNECTED:
threadTextString = "Connected to: " + connectedDeviceName;
threadBtnString = "Disconnect";
mCallback.onViewUpdate(threadBtnString, threadTextString);
break;
case BluetoothConnectionService.STATE_CONNECTING:
threadTextString = "Connecting...";
mCallback.onViewUpdate(threadBtnString, threadTextString);
break;
case BluetoothConnectionService.STATE_NONE:
threadBtnString = "Connect";
threadTextString = "You're not connectedd";
mCallback.onViewUpdate(threadBtnString, threadTextString);
break;
}
private void updateBtn(Button btn, String data){
btn.setText(data);
Log.d(CLASS_TAG + "/" + "updateBtn", "Data: " + data);
}
private void updateTxt(TextView txt, String data){
txt.setText(data);
Log.d(CLASS_TAG + "/" + "updateTxt", "Data: " + data);
}
public void update(String buttonTxt, String txtTxt){
this.updateTxt(connectTxt, txtTxt);
this.updateBtn(connectButton, buttonTxt);
}
MainActivity.java
@Override
public void onViewUpdate(String buttonTxt, String txtTxt) {
HomeFragment homeFragment = (HomeFragment)getSupportFragmentManager().findFragmentById(R.id.frame_container);
if(homeFragment != null){
homeFragment.update(buttonTxt, txtTxt);
}
}
Ответ 5
public class Dcrypt extends Fragment {
Button butD;
ImageButton Dcopy;
EditText getPass;
TextView txtShow;
используйте эту строку кода, чтобы получить поддержку текстового поля
private FragmentManager supportFragmentManager;