使用带有活动按钮,从片段中获取数据

时间:2019-06-25 10:23:33

标签: java android android-fragments

我需要从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();
                }
            }
        });

2 个答案:

答案 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")