我需要从 Activity 中的 Fragment 获取数据(一些字符串)(使用 ViewPager)。我在这个 fragment 中创建了方法:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
v = inflater.inflate(R.layout.fragment_fragment_intro_activity_2, container, false);
ed_operetka = v.findViewById(R.id.edOperetka);
return v;
}
public String getText2(){
return ed_operetka.getText().toString();
}
我在 Activity 中调用了它:
@Override
public void onClick(View v) {
if (viewPager.getCurrentItem()==0) {
viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
showingFirst = false;
}else {startActivity(intent);
String z = frag.getText2(); //line 44
Toast.makeText(IntroActivity.this, "" + z, Toast.LENGTH_SHORT).show();
}
}
});
但它引发了我一个错误:
W/RenderThread: type=1400 audit(0.0:3989185): avc: denied { read } for name="u:object_r:vendor_default_prop:s0" dev="tmpfs" ino=14894 scontext=u:r:untrusted_app:s0:c114,c256,c512,c768 tcontext=u:object_r:vendor_default_prop:s0 tclass=file permissive=0
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wynagrodzeniedodatkowe, PID: 26732
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.wynagrodzeniedodatkowe.fragments.fragment_intro_activity_2.getText2()' on a null object reference
at com.example.wynagrodzeniedodatkowe.IntroActivity$1.onClick(IntroActivity.java:44)
我阅读了有关界面的内容,我知道当按钮是 fragment 的一部分时如何使用它们。但如果不是的话我就不知道了。你可以帮帮我吗?或者给出好的接口(interface)教程。
编辑
ViewPager viewPager;
Button button_next;
boolean showingFirst;
fragment_intro_activity_2 frag;
String z;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intro);
FullScreencall();
button_next = findViewById(R.id.btnNext);
viewPager = findViewById(R.id.viewPager);
viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
frag = new fragment_intro_activity_2();
showingFirst = true;
button_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (viewPager.getCurrentItem()==0) {
viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
showingFirst = false;
}else {
z = frag.getText2(); //line 44
Toast.makeText(IntroActivity.this, "" + z, Toast.LENGTH_SHORT).show();
}
}
});
最佳答案
好吧,据我了解,您需要访问父 Activity 中 Fragment 的成员(textview)。
现在,以下代码的问题:
frag = new fragment_intro_activity_2();
是,这只会创建 fragment 类的实例,但不会填充 View 等。因此,很明显,当尝试访问该 fragment 的任何 View 时,您会得到空指针。仅当通过正常流程启动 fragment 时才会填充 View 。
因此,要解决您的问题,您有两种选择。
1) 当你的fragment在添加到viewpager时调用oncreate时,你可以通过接口(interface)将该textview的文本值传递给父activity,然后在activity中使用它。基本上,创建一个像这样的链接:FRAGMENT-> INTERFACE(文本值)--> ACTIVITY
2)有一种方法可以访问 View 页面的特定 fragment (该 fragment 已被填充等),然后您可以在 fragment 类中使用公共(public)方法来访问文本(就像在原始代码中一样)。对于此选项,请检查此链接:Getting the current Fragment instance in the viewpager
关于java - 使用带有 Activity 的按钮从 fragment 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56751869/