【问题标题】:Can't read data with Retrofit to Fragment无法使用 Retrofit to Fragment 读取数据
【发布时间】:2020-10-20 20:11:26
【问题描述】:

我尝试从 URL 获取数据并将其传输到 Fragment。该程序可以运行,但结果是什么都没有显示。我认为这是因为我传输数据不正确。但我不知道如何解决它。 我的控制器类:

public class Controller implements Callback<News> {
    private static final String BASE_URL = "https://news.com/wwer/";
    private ApiInterface apiInterface;
    private MainActivity mainActivity;

    public Controller(MainActivity mainActivity) {
        this.mainActivity = mainActivity;
    }
    public void start() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        apiInterface = retrofit.create(ApiInterface.class);

        Call<News> news = apiInterface.getNews();
        news.enqueue(this);
    }

    @Override
    public void onResponse(Call<News> call, Response<News> response) {
        News news = response.body();

        String sourceName = news.getSources().get(1).getName();
        Bundle bundle = new Bundle();
        bundle.putString("sourceName", sourceName);

        FragmentManager fm = mainActivity.getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        NameFragment fragmentCurrent = new NameFragment();
        fragmentCurrent.setArguments(bundle);
        ft.add(R.id.fragment,fragmentCurrent);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.addToBackStack(null);
        ft.commit();
    }

    @Override
    public void onFailure(Call<News> call, Throwable t) {
        Log.d("error", "can't parse data: ", t);
    }
}

和我的片段类:

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.name_fragment, container, false);
        TextView textView = view.findViewById(R.id.news_names_list);
        Bundle bundle = new Bundle();
        String sourcNam = bundle.getString("sourceName");

        textView.setText(sourcNam);
        return view;
    }
}

【问题讨论】:

    标签: android android-fragments retrofit


    【解决方案1】:
    @Override
    public void onResponse(Call<News> call, Response<News> response) {
        ...
        Bundle bundle = new Bundle();
        ...
    }
    
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ...
        Bundle bundle = new Bundle();
        ...
    }
    

    您使用new 关键字创建的这两个包是两个完全不同的对象。这意味着如果你在一个包中放入一些参数,另一个包将不会包含它。

    解决方案

    您需要修改的是如何从您用作fragment.setArguments(...) 方法参数的包中提取值。

    setArguments 的反面是 getArguments 方法,它返回你设置的包对象。

    请记住,如果您在使用 getArguments 之前不调用 setArgumentsgetArguments 可以返回 null。在您的情况下,我们可以说您应该始终在提交片段事务之前使用setArguments

    public class NameFragment extends Fragment {
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.name_fragment, container, false);
            TextView textView = view.findViewById(R.id.news_names_list);
            
            String sourcNam = getArguments().getString("sourceName");
    
            textView.setText(sourcNam);
            return view;
        }
    }
    

    【讨论】:

    • 感谢您的建议。现在在片段类中我这样做:Bundle bundle = this.getArguments(); if (bundle!=null) { String sourcNam = bundle.getString("sourceName"); textView.setText(sourcNam); }
    • @JeneaVranceanu 需要帮助 --> stackoverflow.com/questions/64495233/…
    猜你喜欢
    • 2021-11-15
    • 2016-02-05
    • 2017-06-12
    • 2018-09-17
    • 2014-03-20
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多