フラグメントのtextview
をActivity
から変更する方法が見つかりません。 4つのファイルがあります。
_MainActivity.Java
activity_main.xml
FragmentClass.Java
frag_class.xml
_
frag_class.xmlにはtextViewがあり、MainActivity.Javaからテキストを変更したい。 FragmentClassはFragmentを拡張します。このフラグメントは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");
_
しかし悲しいことに、このコードはfc.changeText("some text");
でNullPointerExceptionを返します。また、MainActivityからテキストを直接変更しようとしました:
_ TextView t = (TextView) this.getView().findViewById(R.id.tView);
t.setText(text);
_
失敗しました。
[EDIT]完全なコードは here
@Lalitの答えは正しいですが、fragment_obj.updateTextView();のような関数を作成する必要はないことがわかります。すべてのビューをクラスレベルのオブジェクトとして設定し、textviewを直接更新することができました。
fragmentRegister.textViewLanguage.setText("hello mister how do you do");
注:複数のアクションを実行する必要がある場合は、機能を使用することをお勧めします。
を使用してFragmentのインスタンスを見つけることができます。
サポートライブラリの場合、
_YourFragment fragment_obj = (YourFragment)getSupportFragmentManager().
findFragmentById(R.id.fragment_id);
_
else
_YourFragment fragment_obj = (YourFragment)getFragmentManager().
findFragmentById(R.id.fragment_id);
_
次に、フラグメントにTextView
を更新するメソッドを作成し、_fragment_obj
_を使用してそのメソッドを呼び出します。
fragment_obj.updateTextView();
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);
}
}
私は別の方法でそれを達成しました。私のアプリは次のように動作します:
アプリを起動した後、HomeFragmentを使用してMainActivityを作成しました。 HomeFragmentには、BluetoothConnectionの状態を接続/表示するためのButtonとTextViewがあります。
HomeFragmentでは、BluetoothServiceから情報を受信するためのハンドラーを実装しました。メッセージを受け取った後、TextViewとButtonのテキストを更新したかった。 TextViewおよびButtonのString引数を取得するメソッドを使用して、HomeFragmentでパブリックインターフェイスを作成しました。 onAttach(Activity a)で、アクティビティと話すためのmCallbackオブジェクトを作成しました。
次のステップでは、このインターフェースをMainActivityに実装します。このアクティビティから、TextViewとButtonを更新しています。すべてが次のようになります。
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);
}
@Override
public void onViewUpdate(String buttonTxt, String txtTxt) {
HomeFragment homeFragment = (HomeFragment)getSupportFragmentManager().findFragmentById(R.id.frame_container);
if(homeFragment != null){
homeFragment.update(buttonTxt, txtTxt);
}
}
public class Dcrypt extends Fragment {
Button butD;
ImageButton Dcopy;
EditText getPass;
TextView txtShow;
このコード行を使用して、テキストフィールドのサポートを取得します
private FragmentManager supportFragmentManager;