java - 如何将我的改造数据从 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;
}
}
解决方案
在 Activity 和 Fragment 之间进行通信的最简单方法是使用接口。这个想法基本上是在给定的片段 A 中定义一个接口,并让活动实现该接口。
一旦它实现了那个接口,你就可以在它覆盖的方法中做任何你想做的事情。
接口的另一个重要部分是您必须从片段中调用抽象方法并记住将其转换为您的活动。如果没有正确完成,它应该捕获 ClassCastException。
简单开发人员博客上有一个很好的教程,介绍了如何做这种事情。
我希望这对你有帮助!
推荐阅读
- laravel - 验证 PHPUnit 中的变量
- javascript - 计算mongodb中对象内的键数
- css - 悬停时的换行动画(不完整)
- python - 期待python中的二维数组错误
- c++ - 在 Vulkan 中渲染时 0x69FD41DC (nvoglv32.dll) 出现未处理的异常
- html - 在导航栏和横幅之间添加颜色(前端)
- java - 无法在spring mvc中查看欢迎页面
- c++ - O2 优化级别中断程序工作
- python - “无法使用 `eval()` 评估张量:未注册默认会话”同时使用带有 Estimator API 的自定义 SessionRunHook
- c# - WPF 从动态集 ListViewItem 中获取 MouseHover 事件