Вызвать фрагмент метода из деятельности - PullRequest
0 голосов
/ 13 января 2020

Мне нужно вызвать метод фрагмента, который возвращает массив String в моей родительской Activity.

class MyAsyncTaskOthers2 extends AsyncTask<Void,Void,Void>{

    @Override
    protected Void doInBackground(Void... voids) {
        Intent intent = getIntent();
        Database db = App.getInstance().getDatabase();
        if(db.classDao().doesGroupExist(intent.getStringExtra(Others.EXTRA_DATA))){
            ClassEntity new_group=new ClassEntity();
            new_group.id_of_a_group= intent.getStringExtra(Others.EXTRA_DATA);
            new_group.monday=mon2Fragment.Text_getter();
            db.classDao().insert(new_group);
        }
        if(!db.classDao().doesGroupExist(intent.getStringExtra(Others.EXTRA_DATA))){
            db.classDao().update(mon2Fragment.Text_getter(),intent.getStringExtra(Others.EXTRA_DATA));

        }
        return null;
    }
}

После того, как я нажимаю кнопку «сохранить», я получаю ошибку NPE, и она указывает на

new_group.monday=mon2Fragment.Text_getter();

Вот мой код:

    public class Others2 extends AppCompatActivity {
    private Button button;
    private ViewPager viewPager;
    private Toolbar toolbar;
    private Mon2Fragment mon2Fragment;
    MyAsyncTaskOthers2 mt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_others2);
        button=findViewById(R.id.buttonSave);
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_back);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mt=new MyAsyncTaskOthers2();
                mt.execute();

            }
        });
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(getApplicationContext(), Others.class));
            }
        });
        viewPager = findViewById(R.id.viewpager);
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), 6);
        viewPager.setOffscreenPageLimit(5);
        adapter.AddFragment(new Mon2Fragment(), "Mon");
        adapter.AddFragment(new Tue2Fragment(), "Tue");
        adapter.AddFragment(new Wed2Fragment(), "Wed");
        adapter.AddFragment(new Thu2Fragment(), "Thu");
        adapter.AddFragment(new Fri2Fragment(), "Fri");
        viewPager.setAdapter(adapter);




    }



    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()){
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
            default:
        return super.onOptionsItemSelected(item);
    }
    }
    public String sendData(){
        Intent intent = getIntent();
        return intent.getStringExtra(Others.EXTRA_DATA);
    }

    public String[] sendDataM(){
        Intent intent=getIntent();
        return intent.getStringArrayExtra("my_stringm");
    }
    class MyAsyncTaskOthers2 extends AsyncTask<Void,Void,Void>{

        @Override
        protected Void doInBackground(Void... voids) {
            Intent intent = getIntent();
            Database db = App.getInstance().getDatabase();
            if(db.classDao().doesGroupExist(intent.getStringExtra(Others.EXTRA_DATA))){
                ClassEntity new_group=new ClassEntity();
                new_group.id_of_a_group= intent.getStringExtra(Others.EXTRA_DATA);
                new_group.monday=mon2Fragment.Text_getter();
                db.classDao().insert(new_group);
            }
            if(!db.classDao().doesGroupExist(intent.getStringExtra(Others.EXTRA_DATA))){
                db.classDao().update(mon2Fragment.Text_getter(),intent.getStringExtra(Others.EXTRA_DATA));

            }
            return null;
        }
    }



    public String[] Text_getter() {
        String[] arr={(String) textView1.getText(),(String) textView2.getText(),
                (String) textView3.getText(),(String) textView4.getText(),
                (String) textView5.getText(),(String) textView6.getText(),
                (String) textView7.getText(),(String) textView8.getText()
        };

        return arr;
    }

    public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private final List<Fragment> fragmentList=new ArrayList<>();
    private final List<String> FragmentListTitles=new ArrayList<>();

    public ViewPagerAdapter(FragmentManager fm,int behavior) {
        super(fm,behavior);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }


    @Override
    public int getCount() {
        return FragmentListTitles.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return FragmentListTitles.get(position);
    }



    public void AddFragment(Fragment fragment,String Title){
        fragmentList.add(fragment);
        FragmentListTitles.add(Title);
    }
 }

Не знаю, понадобится ли вам ViewPager, но на всякий случай) И я был бы чрезвычайно признателен, если бы вы могли дать хорошее объяснение в дополнение. Заранее спасибо

1 Ответ

0 голосов
/ 13 января 2020

Ваш Mon2Fragment не инициализирован. Вы можете получить его из адаптера в getItem или

mon2fragment = new Mon2Fragment()
 adapter.AddFragment(mon2Fragment, "Mon");
        adapter.AddFragment(new Tue2Fragment(), "Tue");
        adapter.AddFragment(new Wed2Fragment(), "Wed");
        adapter.AddFragment(new Thu2Fragment(), "Thu");
        adapter.AddFragment(new Fri2Fragment(), "Fri");

, и это поможет с NPE

Также AsyncTask скоро будет устаревшим. Вместо этого используйте сопрограммы, HandlerThreads, Rx Java для выполнения асинхронных c операций

...