java - 我如何将我的 Retrofit 数据从 MainActivity 发送到我的 Fragment?

标签 java android user-interface kotlin

我有一个电影 API,我想在 MovieFragment 中显示热门电影。为了首先进行测试,我想在 TextView 中显示电影标题。对不起我的英语不好。 请帮助我,我很困惑。我的 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;
    });
}

在此 fragment 中,我想从 MainActivity 获取数据并将其附加到我的 TextView 中。我的 fragment 代码:

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;
    }
}

最佳答案

在 Activity 和 Fragment 之间进行通信的最简单方法是使用接口(interface)。这个想法基本上是在给定 fragment A 内定义一个接口(interface)并让 Activity 实现该接口(interface)。

一旦实现了该接口(interface),您就可以在它覆盖的方法中执行任何您想要的操作。

该接口(interface)的另一个重要部分是,您必须从 fragment 中调用抽象方法,并记住将其转换为您的 Activity 。如果未正确完成,它应该捕获 ClassCastException。

Simple Developer 有一个很好的教程有关如何准确执行此类操作的博客。

希望这对您有帮助!

关于java - 我如何将我的 Retrofit 数据从 MainActivity 发送到我的 Fragment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60844919/

相关文章:

使用 args[] 编写 Java Beanshell 脚本到程序中?

android - 如何将字体设置为 fragment 中的 TextView ?

android - 使用官方 facebook-android-sdk 获取用户个人资料 facebook

没有命令行的Java程序

python - 子进程 Popen 阻塞 PyQt GUI

java - 如何从另一种方法访问 JLabel?

java - GWT.create(MyClass.class) 给出 MyClass 必须是一个类的错误

java - AsynchronousByteChannel 的线程含义

java - IntelliJ插件: Navigate from Project View to a file without triggering AutoScrollFromSource?

安卓应用 future.usb.usbmanager