Android 如何更改片段';s文本视图';从活动中删除文本

Android 如何更改片段';s文本视图';从活动中删除文本,android,android-fragments,textview,Android,Android Fragments,Textview,我找不到如何从活动更改片段的文本视图。我有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){ TextVie

我找不到如何从
活动
更改片段的
文本视图
。我有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);
}
在主要活动中,我尝试了以下方法:

FragmentClass fc = new FragmentClass();
fc.changeText("some text");
但遗憾的是,这段代码在
fc.changeText(“某些文本”)中给了我NullPointerException
我还尝试通过以下方式直接从MainActivity更改文本:

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

[编辑]
完整代码是

您可以使用

对于支持库

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

然后在片段中创建一个更新
TextView
的方法,并使用
Fragment\u obj
调用该方法


fragment_obj.updateTextView()

活动
片段
通过
片段事务

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

@Lalit的答案是正确的,但我发现您不需要创建像fragment_obj.updateTextView()这样的函数;。我将所有视图设置为类级别的对象,并能够直接更新textview

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

注意:如果你需要执行多个动作,那么拥有一个功能就是最好的选择。

我用另一种方式完成了它。我的应用程序是这样工作的:

启动应用程序后,我创建了带有HomeFragment的MainActivity。在HomeFragment中,我有用于连接/显示蓝牙连接状态的按钮和文本视图

在HomeFragment中,我实现了从BluetoothService接收信息的处理程序。收到消息后,我想更新文本视图和按钮文本。我在HomeFragment中使用获取TextView和Button的字符串参数的方法创建了公共接口。在onAttach(活动a)中,我创建了用于与活动对话的mCallback对象

下一步是在MainActivity中实现此接口。通过此活动,我正在更新文本视图和按钮。一切都是这样的:

HomeFragment.java MainActivity.java 使用这行代码可以获得对文本字段的支持

private FragmentManager supportFragmentManager;

ClassCastException,我的activity_main.xml中没有frament标记,我只使用id frag的LinearLayout,我使用getSupportFragmentManager().beginTransaction().replace(R.id.frag,fr.commit();对于出现的片段,这可能是ClassCastException的原因吗?是的,这是因为xml中没有片段。但由于您可能会动态添加片段,希望您将拥有片段的实例;在MyFragment类public static Fragment newInstance(){MyFragment MyFragment=new MyFragment();return MyFragment;}中,我如何应用您的代码?只需在
MyFragment
类中创建一个公共方法,更新TextView的值,并使用
MyFragment.method\u name()从FragmentActivity调用它即可文本未更改。对不起,如果我没有碎片标签,R.id.yourFragment是什么?是activity_main.xml中保存片段的容器,还是frag_class.xml的outter布局的id?您必须创建片段自己的布局,例如“frag.xml”并将R.id.yourFragment编辑为R.id.frag。该片段是动态创建的,正如我所读的,因此不可能为动态创建的片段提供id。在我的xml文件中,我没有。在创建替换片段时,我确实给出了标记,并将您的代码更改为findFragmentByTag,但它仍然给我空指针异常。你能在这里看到完整的代码吗?我不知道这是否是一个好的做法,但这似乎是一个好的选择:)。有一次我甚至使用静态变量在片段中使用它们。。。这是设置文本的最简单方法,对我来说很有效,因为我只得到了0到10个短字符串。不管怎样,我相信你的答案会对某些人有用,因为它是有效的解决方案,这里是你的+1;
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;