我需要从Activity中的Fragment(使用ViewPager)中获取数据(少量字符串)。我在这个片段中制作了方法:
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)
我了解了接口,我知道当按钮是片段的一部分时如何使用它们。但是,如果不是这样,我也不知道。你可以帮帮我吗?或提供良好的界面教程。
编辑
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();
}
}
});
答案 0 :(得分:0)
好的,据我了解,您需要访问父活动中Fragment的成员(文本视图)。
现在,出现以下代码问题:
frag = new fragment_intro_activity_2();
是,这仅创建片段类的实例,但不填充视图等。因此,很明显,当您尝试访问该片段的任何视图时,都会得到nullpointer。仅当通过常规流启动片段时,才会填充视图。
因此,要解决您的问题,您有两种选择。
1)当您将片段添加到viewpager时调用片段oncreate时,您可以通过界面将该textview的文本值传递给父活动,然后在活动中使用它。基本上,创建这样的链接:FRAGMENT-> INTERFACE(文本值)-> ACTIVITY
2)有一种方法可以访问viewpager的特定片段(该片段已被填充等),然后您可以在片段类中使用一个公共方法来访问文本(就像您的原始代码一样)。对于此选项,请检查以下链接:Getting the current Fragment instance in the viewpager
答案 1 :(得分:0)
最好的方法是使用Intent传递数据。这是一个简单的演示
来自片段:
Intent intent =new Intent(getActivity(),ActivityName.class);
in.putExtra("const", yourValue);
startActivity(in);
来自活动:
if(getIntent().getExtra != null){
String value = Intent.getExtra("const");
}
现在,您可以在片段中使用通过片段发送的字符串。 删除您的意图onStop()或onDestroy()方法中
getIntent().removeExtra("const")