Как я могу отправить свои данные по модернизации из MainActivity в мой фрагмент? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть один API для фильмов, я хочу показать в MovieFragment популярные фильмы. Для тестирования сначала я хочу показать название фильма в текстовом представлении. Извините за мой английский sh. Пожалуйста, помогите мне, я в замешательстве. Моя MainActivity. java код:

package com.example.view;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;

import android.os.Bundle;
import android.widget.Toast;

import com.example.view.fragments.MovieFragment;
import com.example.workingproject.R;
import com.google.android.material.bottomnavigation.BottomNavigationView;

import java.util.List;

import retrofit.IApiInterface;
import retrofit.MoviesResult;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity {

    private static final String BASE_URL = "https://developers.themoviedb.org/";
    private static final String API_KEY = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    private static final String CATEGORY = "Popular";
    private static final String LANGUAGE = "en-US";
    public static int pages = 1;

    private String text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_nav);
        bottomNavigationView.setOnNavigationItemSelectedListener(navListener);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        IApiInterface apiInterface = retrofit.create(IApiInterface.class);

        Call<MoviesResult> moviesResultCall = apiInterface.getPopularMovies(CATEGORY, API_KEY, LANGUAGE, pages);

        moviesResultCall.enqueue(new Callback<MoviesResult>() {

            @Override
            public void onResponse(Call<MoviesResult> call, Response<MoviesResult> response) {
                if (response.isSuccessful()) {
                    MoviesResult moviesResult = response.body();

                    List<MoviesResult.Result> result = moviesResult.getResults();

                    for (MoviesResult.Result r : result) {
                        text = r.getTitle();
                        Toast.makeText(MainActivity.this, "text", Toast.LENGTH_SHORT).show();
                    }
                }
            }

            @Override
            public void onFailure(Call<MoviesResult> call, Throwable t) {
                t.printStackTrace();
            }
        });
    }

    private BottomNavigationView.OnNavigationItemSelectedListener navListener = ((menuItem) -> {
        Fragment selectedFragment = null;

        switch (menuItem.getItemId()) {
            case R.id.frame_container:
                selectedFragment = new MovieFragment();
                break;
        }

        getSupportFragmentManager().beginTransaction().replace(R.id.frame_container, selectedFragment).commit();
        return true;
    });
}

В этом фрагменте я хочу получить данные из MainActivity и добавить их в свое текстовое представление. Код моего фрагмента:

package com.example.view.fragments;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.example.workingproject.R;

import retrofit.MoviesResult;

public class MovieFragment extends Fragment {

    private TextView textView;

    private OnDataSetListener listener;

    public interface OnDataSetListener {
         void sendData(String data);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_movies, container, false);

        textView = view.findViewById(R.id.text_view);

        return view;
    }
}

1 Ответ

0 голосов
/ 25 марта 2020

Самый простой способ связи между вашей деятельностью и фрагментами - это использование интерфейсов. Идея в основном состоит в том, чтобы определить интерфейс внутри данного фрагмента A и позволить действию реализовать этот интерфейс.

Как только он реализует этот интерфейс, вы можете делать все, что захотите, в методе, который он переопределяет.

Другая важная часть интерфейса заключается в том, что вы должны вызывать абстрактный метод из вашего фрагмента и не забывать приводить его к своей деятельности. Он должен перехватывать ClassCastException, если не все сделано правильно.

Существует хороший учебник по Simple Developer Блог о том, как делать именно такие вещи.

Я надеюсь, что это был полезен для вас!

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