Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试更新编辑文本字段时,无法从MainActivity获取片段地址_Java_Android_Android Fragments_Reference_Android Edittext - Fatal编程技术网

Java 尝试更新编辑文本字段时,无法从MainActivity获取片段地址

Java 尝试更新编辑文本字段时,无法从MainActivity获取片段地址,java,android,android-fragments,reference,android-edittext,Java,Android,Android Fragments,Reference,Android Edittext,我有一个MainActivity(MA)运行几个片段,这些片段彼此不通信,而是通过“onClick”android机制与MA通信。 通过选择微调器和按下“onClick”按钮,我们实现了MA的RetrievePatientRecord方法 我执行数据库调用以获取所选的db记录(根据注释行),然后测试是否存在现有的患者片段,我打算将数据库记录的各个字段作为其基本形式放入其中。 使用未找到的“null”条件,我实例化了一个现有PatientTFG片段的新实例。 但是,当我试图通过ExistPatie

我有一个MainActivity(MA)运行几个片段,这些片段彼此不通信,而是通过“onClick”android机制与MA通信。 通过选择微调器和按下“onClick”按钮,我们实现了MA的RetrievePatientRecord方法

我执行数据库调用以获取所选的db记录(根据注释行),然后测试是否存在现有的患者片段,我打算将数据库记录的各个字段作为其基本形式放入其中。 使用未找到的“null”条件,我实例化了一个现有PatientTFG片段的新实例。 但是,当我试图通过ExistPatientFg片段中的setter来使用现有的Patient引用来设置“Title”字段值时,程序将使用NPE

我曾尝试使用注释掉的行…getFragmentManager().findFragmentById(R.id…)来“获取片段地址”,但有趣的是,使用android studio的代码完成工具是唯一的R.id。它将提供的对象是“fragment_container”,虽然它进行编译,但如果我将其保留在代码行中,它将落在这行代码上

所以我有点困惑。我已经阅读了fragment/MainActivity/edit文本字段主题区域中的大多数其他S/O答案,但还没有找到可以帮助我的解决方案,所以我在这里寻求一些帮助。(我的activity_main.xml布局文件正在使用id为“fragment_container”的FrameLayout布局,这也可能与此相关)

片段的java代码是:-

public class ExistingPatientFg extends Fragment {
public ButtonPlus btn;
public ButtonPlus analysisBtn;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}


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

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    EditText editText = (EditText)getView().findViewById(R.id.bannerText);
    editText.setText("Existing Patient");

    btn = (ButtonPlus)getActivity().findViewById(R.id.Goto_Scanning_Page);

    analysisBtn = (ButtonPlus)getView().findViewById(R.id.Analysis);
    btn.setEnabled(true);

}


public void setTitleField(String string){
    EditText et = (EditText)getView().findViewById(R.id.Title);
    et.setText(string);
}

您可以通过添加片段时提供的标记查找片段:

getFragmentManager().beginTransaction().replace(R.id.fragment_container, existingPatient, "Your Tag Here");
然后按标签查找:

getFragmentManager().findFragmentByTag("Your Tag Here")
或者,如果仍要按ID查找,则应为以下返回的ID: gragment.getID(); 它应该是片段的容器或者片段中的顶部布局,我不确定。(因此,您可以在添加片段后检查调试

if fragment.getID()==R.id.container

我怀疑空指针异常不是因为您没有对片段的引用,而是因为您在片段视图膨胀之前调用了setTitleField,所以编辑文本字段还不存在

尝试将setTitleField移动到trans.commit之后,或者更好地将标题作为额外参数传递给片段

existingPatient = new ExistingPatientFg();
Bundle bundle = new Bundle();
bundle.putString("title",cTitle);
existingPatient.setArguments(bundle);                 
trans = getFragmentManager().beginTransaction();
trans.replace(R.id.fragment_container, existingPatient);
trans.addToBackStack(null);
trans.commit();
并在片段的onCreateView中使用以下内容来获取标题

String cTitle = getArguments().getString("title");

请参见

Hi QuantumTiger,非常感谢您的解决方案。您完全正确,一旦我使用“Bundle”解决方案,使用“getArguments()”NPE就消失了。但是,我必须将getArguments()..行代码添加到片段的onActivityCreated(..)方法中,而不是您建议的onCreateView()方法,我真的不明白。(当我不明白一段代码为什么工作时,我总是有点不高兴,尽管它确实工作很好!)此外,我还跟踪了您的链接到“…将变量从活动传递到片段…”,这强化了您的解决方案,我倾向于同意评论人士的说法,他们说developer.android.com文档根本没有很好地解释这一领域!很高兴它有所帮助。我在片段、活动和查看页面之间传递数据方面也遇到过类似的困难…就NPE而言,这一切都是为了确保在视图中的元素创建之后才能访问它,因此在onCreateView中读取捆绑包是可以的,但根据您的经验,显然编辑文本字段在该点上仍然没有创建。如果您能看到我的问题,请感谢您,正如您在上面的QuantumTiger中所看到的那样答案恰到好处。
String cTitle = getArguments().getString("title");