我想从片段将数据获取到主活动,我的数据位于片段中,当我单击主活动上的按钮时,我需要在主活动中抓取该数据

我从StackOverFlow找到了一个解决方案,就是这样.

public void getFromUser(View view) {        
    ConversationFragment fragment1 = (ConversationFragment)getSupportFragmentManager().findFragmentById(R.id.container);
    View frag=fragment1.getView();
    EditText editText1 =(EditText) frag.findViewById(R.id.message);
    String message=editText1.getText().toString();
    sendMessage(message);

}

但很少有人提到这是一种不好的做法,然后我听说用界面做类似的事情,我是Java新手,所以有人可以提到通过单击主活动的按钮从片段中获取数据的示例吗

推荐答案

是的,onAttachFragmentAndroid 9中被弃用,您可以使用其他方法来实现类似的功能,具体取决于代码的上下文.但到目前为止,这不是必需的,因为您没有进行任何片段转换.

方法1

通过使用公共职能

ConversationFragment.java:

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

import androidx.fragment.app.Fragment;

public class ConversationFragment extends Fragment {

    private EditText editText;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_conversation, container, false);

        // Initialize EditText
        editText = view.findViewById(R.id.editText);

        return view;
    }

    public String getEditTextValue() {
        return editText.getText().toString();
    }
}

MainActivity.java:

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private ConversationFragment conversationFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Initialize the fragment
        conversationFragment = new ConversationFragment();

        // Add the fragment to the container
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, conversationFragment)
                .commit();

        // Initialize Button
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Get EditText value from the Fragment
                String editTextValue = conversationFragment.getEditTextValue();
                onDataReceivedFromFragment(editTextValue);
            }
        });
    }

    public void onDataReceivedFromFragment(String data) {
        // Process the received data here
        Log.d("Data received in Activity", data);
    }
}

方法2

通过使用界面

ConversationFragment.java:

    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.EditText;

    import androidx.fragment.app.Fragment;

    public class ConversationFragment extends Fragment {

        private EditText editText;
        private EditTextValueListener listener;

        public interface EditTextValueListener {
            void onEditTextValueChanged(String value);
        }

        public void setEditTextValueListener(EditTextValueListener listener) {
            this.listener = listener;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_conversation, container, false);

            // Initialize EditText
            editText = view.findViewById(R.id.editText);

            return view;
        }

        private void sendDataToActivity(String data) {
            if (listener != null) {
                listener.onEditTextValueChanged(data);
            }
        }

        public void sendDataToActivity() {
            String data = editText.getText().toString();
            sendDataToActivity(data);
        }
    }

MainActivity.java:

    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;

    import androidx.appcompat.app.AppCompatActivity;

    public class MainActivity extends AppCompatActivity implements ConversationFragment.EditTextValueListener {

        private ConversationFragment conversationFragment;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            // Initialize the fragment
            conversationFragment = new ConversationFragment();

            // Add the fragment to the container
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, conversationFragment)
                    .commit();

            // Initialize Button
            Button button = findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Call method in Fragment to send EditText value
                    conversationFragment.sendDataToActivity();
                }
            });
        }

        @Override
        public void onEditTextValueChanged(String value) {
            // Process the received data here
            Log.d("Data received in Activity", value);
        }
    }

确保您也相应更新布局文件(fragment_conversation.html和activity_main.html).

Java相关问答推荐

获取拦截器内部的IP地址

RDX触发ChoiceBox转换器(并按字符串值排序)

伪类focus-in不适用于PFA中的选项卡

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

如何才能使我的程序不会要求两次输入?

RichFaces 3.x-Spring Boot-迁移web.xml

Java-动态绑定-问题-了解

如何在Microronaut中将 map 读取为 map

如何只修改父类ChroniclerView位置0处的第一个嵌套ChroniclerView(child)元素?

在Java 15应用程序中运行Java脚本和Python代码

在settings.gradle.kts和Build.gradle.kts中使用公共变量

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

将基于实例编号的对象列表拆分为新的对象列表

当我将JTextField的getText函数与相等的String进行比较时;t返回true

Spring Mapstruct如何获取Lazy初始化实体字段的信息?

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了

无泄漏函数的Java DRY