31

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

しかし、悲しいことに、このコードでは NullPointerExceptionfc.changeText("some text"); が返されます。また、テキストを MainActivity から直接変更しようとしました。

 TextView t = (TextView) this.getView().findViewById(R.id.tView);
 t.setText(text);

失敗しました。

[編集] 完全なコードはこちら

4

5 に答える 5

12

以下を使用して Fragment のインスタンスを見つけることができます。

サポート ライブラリについては、

YourFragment fragment_obj = (YourFragment)getSupportFragmentManager().
                                              findFragmentById(R.id.fragment_id);

そうしないと

YourFragment fragment_obj = (YourFragment)getFragmentManager().
                                             findFragmentById(R.id.fragment_id); 

次に、Fragment にメソッドを作成して更新し、そのメソッドをlikeTextViewを使用して呼び出します。fragment_obj

fragment_obj.updateTextView();

于 2013-04-30T08:13:07.537 に答える
12

から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);  
    }
}
于 2013-04-30T08:20:06.017 に答える
6

@Lalitの答えは正しいですが、fragment_obj.updateTextView();のような関数を作成する必要はありません。すべてのビューをクラス レベル オブジェクトとして設定し、テキストビューを直接更新できました。

fragmentRegister.textViewLanguage.setText("hello mister how do you do");

注: 複数のアクションを実行する必要がある場合は、関数を用意することをお勧めします。

于 2014-06-12T06:07:50.167 に答える
1

私は別の方法でそれを達成しました。私は自分のアプリを次のように動作させています:

アプリを起動した後、HomeFragment を含む MainActivity が作成されました。HomeFragment には、BluetoothConnection の状態を接続/表示するための Button と TextView があります。

HomeFragment では、BluetoothService から情報を受け取るための Handler を実装しました。メッセージを受け取った後、TextView と Button テキストを更新したいと思いました。TextView と Button の文字列引数を取得するメソッドを使用して、HomeFragment にパブリック インターフェイスを作成しました。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);
    }
}
于 2014-08-28T08:04:21.170 に答える