Получить данные из фрагмента, используя кнопку с активностью - PullRequest
0 голосов
/ 25 июня 2019

Мне нужно взять данные (несколько строк) из фрагмента в Activity (используя 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 голосов
/ 25 июня 2019

Лучше всего передавать данные с помощью Intent.Вот простая демонстрация

From Fragment:

Intent intent =new Intent(getActivity(),ActivityName.class);
in.putExtra("const", yourValue);
startActivity(in);

From Activity:

if(getIntent().getExtra != null){
String value = Intent.getExtra("const");
}

Теперь вы можете использовать строку, которую вы посылаете через фрагмент во фрагменте.Удалите ваше намерение onStop () или в методе onDestroy ()

 getIntent().removeExtra("const")
0 голосов
/ 25 июня 2019

Хорошо, из того, что я понимаю, вам нужно получить доступ к элементу (текстовое представление) фрагмента в родительском действии.

Теперь проблема со следующим кодом:

frag = new fragment_intro_activity_2();

, это только создает экземпляр класса фрагмента, но НЕ заполняет представление и т. Д. Таким образом, очевидно, что вы получаете нулевой указатель при попытке доступа к любому представлению этого фрагмента.Представление заполняется только тогда, когда фрагмент инициируется обычным потоком.

Итак, для решения вашей проблемы у вас есть два варианта.

1) Когда ваш фрагмент вызывает oncreate, когда вы добавляете его в viewpager, вы можете передать текстовое значение этого textview родительскому действию через интерфейс и затем использовать его в действии.По сути, создание такой ссылки: FRAGMENT-> INTERFACE (текстовое значение) -> ACTIVITY

2) Существует способ получить доступ к определенному фрагменту окна просмотра (этот фрагмент уже заполнен и т. Д.) Итогда вы можете иметь открытый метод в классе фрагмента для доступа к тексту (как в вашем исходном коде).Для этой опции, проверьте эту ссылку: Получение текущего экземпляра Fragment в viewpager

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...