Android - startActivityForResult z innej activity

Odpowiedz Nowy wątek
2019-10-24 10:30
0

Witam, mam problem nad którym głowię się już kilka dni.

Mam klasę
AllBooksActivity w której wyświetlane są wszystkie książki, w BooksRecViewAdapter będącym adapterem do RecyclerView znajdującym się w tym AllBooksActivity mam OnClicka dla pojedynczego itemu RecyclerView'a.

//BooksRecViewAdapter
@Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
        Log.d(TAG, "onBindViewHolder: called");

        holder.setData(books.get(position).getTitle(), books.get(position).getImageUrl());

        holder.relLay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(context, OpenedBookActivity.class);
                intent.putExtra("book",books.get(position));

                ((Activity)context).startActivityForResult(intent, BooksTabFragment.UPDATE_BOOK_ACTIVITY_REQUEST_CODE);
            }
        });
    }

gdzie context dostaje od AllBooksActivity właściwie to przez TabFragment z ViewPagera

public BooksRecViewAdapter(Context context) {
        this.context = context;
        this.inflater = LayoutInflater.from(context);
    }

czyli gdy wywołuję tam startActivityForResult() to onActivityResult() jest z AllBooksActivity.

I tak w AllBooksActivity mam też fab z onClickiem który otwiera activity dla tworzenia nowej książki

//AllBooksActivity

private void setOnClickListeners() {
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mStartActivityForResult(BooksTabFragment.NEW_BOOK_ACTIVITY_REQUEST_CODE,null);
                }
            });
    }
    public void mStartActivityForResult(int requestCode, Serializable extraSerializable){

        Intent intent = new Intent(context,AddBookActivity.class);

        if(requestCode == BooksTabFragment.NEW_BOOK_ACTIVITY_REQUEST_CODE){
            ((Activity)AllBooksActivity.this).startActivityForResult(intent,BooksTabFragment.NEW_BOOK_ACTIVITY_REQUEST_CODE);
        }
        else if(requestCode == BooksTabFragment.UPDATE_BOOK_ACTIVITY_REQUEST_CODE && !extraSerializable.equals(null)){
            intent.putExtra("thisBook",extraSerializable);
            ((Activity)AllBooksActivity.this).startActivityForResult(intent,BooksTabFragment.UPDATE_BOOK_ACTIVITY_REQUEST_CODE);
        }
    }

i chcę tą metodę również wykorzystać w innej Activity OpenedBookActivity jako przycisk do edycji ale nie mogę dostać instancji klasy AllBooksActivity i teraz właśnie nie mam pojęcia jak to obejść?

//OpenedBookActivity
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.opened_book_menu, menu);

        MenuItem editItem = menu.findItem(R.id.action_edit);
        editItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                //I TOTALLY DONT KNOW WHAT CAN I DO
               // allBooksActivity.startActivityForResult(BooksTabFragment.UPDATE_BOOK_ACTIVITY_REQUEST_CODE, thisBook);
                return false;
            }
        });

        MenuItem delItem = menu.findItem(R.id.action_delete);
        delItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                //AlertDialog.Builder builder;
                return false;
            }
        });
        return true;

Proszę o pomoc
Cały kod wstawiam tutaj https://github.com/Xezolpl/My-Library


„Standardowa edukacja zapewni Ci przeżycie. Samokształcenie- fortunę." - Jim Rohn

Pozostało 580 znaków

2019-10-24 12:22
1

Błędem jest samo istnienie metody mStartActivityForResult w AllBooksActivity. Albo wydziel ją gdzieś indziej, albo przenieś logikę do AddBookActivity, a wywołuj tylko w razie potrzeby bezpośrednio startActivityForResult`, gdzie za pomocą extras i request code wysterujesz, co ma robić - edytować, czy dodawać nową.

Pozostało 580 znaków

2019-10-24 16:41
0
Meini napisał(a):

Błędem jest samo istnienie metody mStartActivityForResult w AllBooksActivity. Albo wydziel ją gdzieś indziej, albo przenieś logikę do AddBookActivity, a wywołuj tylko w razie potrzeby bezpośrednio startActivityForResult`, gdzie za pomocą extras i request code wysterujesz, co ma robić - edytować, czy dodawać nową.

No dobrze ale w sensie że jak wywołuję to startActivityForResult przy przycisku od edit to onActivityResult jest już w OpenedBookActivity. Czyli raz - redundancja kodu, a dwa - i tak nie mogę się dobrać do instancji BookViewModel by wstawić do DB update'a. I co z tym zrobić?

onActivityResult() wygląda u mnie tak

 @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        BookViewModel model = ((BooksTabFragment)sectionsPagerAdapter.getItem(books_viewPager.getCurrentItem())).getBookViewModel();

        if (requestCode == BooksTabFragment.NEW_BOOK_ACTIVITY_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            Book newBook = (Book) data.getSerializableExtra("newBook");
            model.insert(newBook);
        }
        else if (requestCode == BooksTabFragment.UPDATE_BOOK_ACTIVITY_REQUEST_CODE && resultCode == Activity.RESULT_OK){
            Book resultBook = (Book) data.getSerializableExtra("resultBook");
            model.update(resultBook);
        }
        else {

        }
    }

„Standardowa edukacja zapewni Ci przeżycie. Samokształcenie- fortunę." - Jim Rohn
edytowany 2x, ostatnio: Xezolpl, 2019-10-24 16:48

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0