我有一个电影 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/