首页 > 解决方案 > 如何将我的改造数据从 MainActivity 发送到我的片段?

问题描述

我有一个电影 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;
    });
}

在这个片段中,我想从 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;
    }
}

标签: javaandroiduser-interfacekotlin

解决方案


在 Activity 和 Fragment 之间进行通信的最简单方法是使用接口。这个想法基本上是在给定的片段 A 中定义一个接口,并让活动实现该接口。

一旦它实现了那个接口,你就可以在它覆盖的方法中做任何你想做的事情。

接口的另一个重要部分是您必须从片段中调用抽象方法并记住将其转换为您的活动。如果没有正确完成,它应该捕获 ClassCastException。

简单开发人员博客上有一个很好的教程,介绍了如何做这种事情。

我希望这对你有帮助!


推荐阅读