有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何正确地将数据从一个活动传递到另一个活动?

目前,我正在开发一个新闻应用程序,我已经实现了Webview,但URL并没有加载数据并显示空屏幕。我已经学习了一些教程,其中可以使用Intent Parcelable传递对象。我想实现的是,当用户单击文章项时,我想使用Parcelable显示相应的url show it web视图,但显示的是白色屏幕

下面是我实施webview的DetailActivity中的代码

public class DetailActivity extends Activity{
    @BindView(R.id.article)
    public WebView article_webview;



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.detail_activity);
        ButterKnife.bind(this);
        Article object = (Article) getIntent().getParcelableExtra("myDataKey");
        article_webview.getSettings().setJavaScriptEnabled(true);
        article_webview.loadUrl("myDataKey");





    }
    public class WebViewController extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            return true;
        }
    }

**below my parcelable Model Article class **

public class Article implements Parcelable {

    @SerializedName("source")
    @Expose
    private Source source;
    @SerializedName("author")
    @Expose
    private String author;
    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("description")
    @Expose
    private String description;
    @SerializedName("url")
    @Expose
    private String url;
    @SerializedName("urlToImage")
    @Expose
    private String urlToImage;
    @SerializedName("publishedAt")
    @Expose
    private String publishedAt;
    @SerializedName("content")
    @Expose
    private String content;



    public Source getSource() {
        return source;
    }

    public void setSource(Source source) {
        this.source = source;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUrlToImage() {
        return urlToImage;
    }

    public void setUrlToImage(String urlToImage) {
        this.urlToImage = urlToImage;
    }

    public String getPublishedAt() {
        return publishedAt;
    }

    public void setPublishedAt(String publishedAt) {
        this.publishedAt = publishedAt;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }






    public Article(Parcel in) {
        source = (Source) in.readValue(Source.class.getClassLoader());
        author = in.readString();
        title = in.readString();
        description = in.readString();
        url = in.readString();
        urlToImage = in.readString();
        publishedAt = in.readString();
        content = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeValue(source);
        dest.writeString(author);
        dest.writeString(title);
        dest.writeString(description);
        dest.writeString(url);
        dest.writeString(urlToImage);
        dest.writeString(publishedAt);
        dest.writeString(content);
    }

    @SuppressWarnings("unused")
    public static final Parcelable.Creator<Article> CREATOR = new Parcelable.Creator<Article>() {
        @Override
        public Article createFromParcel(Parcel in) {
            return new Article(in);
        }

        @Override
        public Article[] newArray(int size) {
            return new Article[size];
        }
    };
}

在我传递包裹对象的主活动类下方

public class MainActivity extends BottomBarHolderActivity implements AllJazeeraFragment.OnFragmentInteractionListener, BBCFragment.OnFragmentInteractionListener, CNNFragment.OnFragmentInteractionListener, CBCNewsFragment.OnFragmentInteractionListener {


    //    private ApiService apiService;
    public static final String url_key = "urlKey";



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       // getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

        Article article = new Article(Parcel.obtain());
        Intent i = new Intent(this, DetailActivity.class);


        i.putExtra("myDataKey", article.getUrl()); // using the (String name, Parcelable value) overload!
        startActivity(i);

        NavigationPage page1 = new NavigationPage("AllJazeera", ContextCompat.getDrawable(this, R.drawable.alljazeera), AllJazeeraFragment.newInstance());
        NavigationPage page2 = new NavigationPage("Support", ContextCompat.getDrawable(this, R.drawable.bbc_icon), CNNFragment.newInstance());
        NavigationPage page3 = new NavigationPage("Billing", ContextCompat.getDrawable(this, R.drawable.cnn_icon), AllJazeeraFragment.newInstance());
        NavigationPage page4 = new NavigationPage("Profile", ContextCompat.getDrawable(this, R.drawable.cbc_icon), CBCNewsFragment.newInstance());

        List<NavigationPage> navigationPages = new ArrayList<>();
        navigationPages.add(page1);
        navigationPages.add(page2);
        navigationPages.add(page3);
        navigationPages.add(page4);

        super.setupBottomBarHolderActivity(navigationPages);
    }


    public void onClicked() {
        Toast.makeText(this, "Clicked!", Toast.LENGTH_SHORT).show();
    }

}

在我的NewsAdapter类下面,我在其中实现了对项目的单击listener和recyclerview

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsViewHolder> {


    private List<Article> articleList;

    public NewsAdapter(List<Article> articleList) {

        this.articleList = articleList;
    }


    @NonNull
    @Override
    public NewsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.
                from(viewGroup.getContext()).
                inflate(R.layout.news_item, viewGroup, false);
        return new NewsViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull NewsViewHolder newsViewHolder, int i) {
        Article article = articleList.get(i);
        newsViewHolder.articleAuthor.setText(article.getAuthor());
        newsViewHolder.articleTitle.setText(article.getTitle());
        newsViewHolder.articleDescription.setText(article.getDescription());
        Picasso.get().load(article.getUrlToImage()).into(newsViewHolder.articleImage);
        newsViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), DetailActivity.class);
//start the activity from the view/context
                view.getContext().startActivity(intent);
            }
        });

    }





    @Override
    public int getItemCount() {

        return articleList.size();
    }


    public final static class NewsViewHolder extends RecyclerView.ViewHolder {
        // TextView articleAuthor, articleTitle, articleDescription, articleUrl;
        //  ImageView articleImage;

        @BindView(R.id.article_Image)
        ImageView articleImage;
        @BindView(R.id.article_Author)
        TextView articleAuthor;
        @BindView(R.id.article_Title)
        TextView articleTitle;

        @BindView(R.id.article_Description)
        TextView articleDescription;

        @BindView(R.id.article_Url)
        TextView articleUrl;


        public NewsViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);


        }


    }
}

在我的课程结束点以下,我会得到每一条新闻

public interface NewsInterface {


    @GET("v2/top-headlines?sources=al-jazeera-english&apiKey=a5cc70bd52c9436785557878f4aa49e1")
    Call <ArticleResponse> getAllJazeera();

    @GET("v2/top-headlines?sources=cbc-news&apiKey=a5cc70bd52c9436785557878f4aa49e1")
    Call <ArticleResponse> getCbC();

    @GET("v2/top-headlines?sources=bbc-news&apiKey=a5cc70bd52c9436785557878f4aa49e1")
    Call <ArticleResponse> getBBC();

    @GET("v2/top-headlines?sources=cnn&apiKey=a5cc70bd52c9436785557878f4aa49e1")
    Call <ArticleResponse> getCNN();


}

低于我的改装客户端类别

public class NewsClient  {

    public static final String BASE_URL = "https://newsapi.org/";

    /**
     * Get Retrofit Instance
     */
    private static Retrofit getRetrofitInstance() {
        return new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    /**
     * Get API Service
     *
     * @return API Service
     */
    public static NewsInterface getApiService() {
        return getRetrofitInstance().create(NewsInterface.class);
    }
    }


**below my CnnFragment class**
public class CNNFragment extends Fragment {


    private CNNFragment.OnFragmentInteractionListener listener;
    NewsAdapter adapter;
    public ArrayList<Article> articleList = new ArrayList();
    RecyclerView recyclerView;

    public static CNNFragment newInstance() {
        return new CNNFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.cnn_fragment, container, false);
        NewsInterface apiService = NewsClient.getApiService();
        Call<ArticleResponse> call = apiService.getCNN();

        call.enqueue(new Callback <ArticleResponse>() {
            @Override
            public void onResponse(Call <ArticleResponse> call, Response <ArticleResponse> response) {

                articleList = new ArrayList(response.body().getArticles());
                recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
                adapter = new NewsAdapter(articleList);
                RecyclerView.LayoutManager eLayoutManager = new LinearLayoutManager(getActivity());
                recyclerView.setLayoutManager(eLayoutManager);
                recyclerView.setAdapter(adapter);

            }

            @Override
            public void onFailure(Call <ArticleResponse> call, Throwable t) {

            }
        });

        return rootView;
    }


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof CNNFragment.OnFragmentInteractionListener) {
            listener = (CNNFragment.OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        listener = null;
    }

    public interface OnFragmentInteractionListener {
    }


}

和cnn_片段。我托管recyclerview

<LinearLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    安卓:layout_width="match_parent"
    安卓:orientation="vertical"
    安卓:layout_height="match_parent">


    <安卓.support.v7.widget.RecyclerView
        安卓:layout_width="match_parent"
        安卓:id="@+id/recycler_view"
        安卓:scrollbars="vertical"
        安卓:layout_height="wrap_content"/>

</LinearLayout>

在我实施BBCNews的BBC片段下方

公共类BBCFragment扩展了片段{

private OnFragmentInteractionListener listener;

RecyclerView recyclerView;
NewsAdapter adapter;
public ArrayList<Article> articleList = new ArrayList();
public static BBCFragment newInstance() {
    return new BBCFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   final  View rootView = inflater.inflate(R.layout.bbc_fragment, container, false);

    NewsInterface apiService = NewsClient.getApiService();
    Call <ArticleResponse> call = apiService.getBBC();

    call.enqueue(new Callback <ArticleResponse>() {
        @Override
        public void onResponse(Call<ArticleResponse> call, Response <ArticleResponse> response) {

            articleList = new ArrayList(response.body().getArticles());
            recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
            adapter = new NewsAdapter(articleList);
            RecyclerView.LayoutManager eLayoutManager = new LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(eLayoutManager);
            recyclerView.setAdapter(adapter);

        }

        @Override
        public void onFailure(Call<ArticleResponse> call, Throwable t) {

        }
    });

    return rootView;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        listener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    listener = null;
}

public interface OnFragmentInteractionListener {
}

}

bbc_fragment.xml hosted recyclerview
<LinearLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    安卓:layout_width="match_parent"
    安卓:orientation="vertical"
    安卓:layout_height="match_parent">


    <安卓.support.v7.widget.RecyclerView
        安卓:layout_width="match_parent"
        安卓:id="@+id/recycler_view"
        安卓:scrollbars="vertical"
        安卓:layout_height="wrap_content"/>

</LinearLayout>

其他片段新闻与之前的片段相同

Pojo模型类下方的

public class Article implements Parcelable {

    @SerializedName("source")
    @Expose
    private Source source;
    @SerializedName("author")
    @Expose
    private String author;
    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("description")
    @Expose
    private String description;
    @SerializedName("url")
    @Expose
    private String url;
    @SerializedName("urlToImage")
    @Expose
    private String urlToImage;
    @SerializedName("publishedAt")
    @Expose
    private String publishedAt;
    @SerializedName("content")
    @Expose
    private String content;



    public Source getSource() {
        return source;
    }

    public void setSource(Source source) {
        this.source = source;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUrlToImage() {
        return urlToImage;
    }

    public void setUrlToImage(String urlToImage) {
        this.urlToImage = urlToImage;
    }

    public String getPublishedAt() {
        return publishedAt;
    }

    public void setPublishedAt(String publishedAt) {
        this.publishedAt = publishedAt;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }






    public Article(Parcel in) {
        source = (Source) in.readValue(Source.class.getClassLoader());
        author = in.readString();
        title = in.readString();
        description = in.readString();
        url = in.readString();
        urlToImage = in.readString();
        publishedAt = in.readString();
        content = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeValue(source);
        dest.writeString(author);
        dest.writeString(title);
        dest.writeString(description);
        dest.writeString(url);
        dest.writeString(urlToImage);
        dest.writeString(publishedAt);
        dest.writeString(content);
    }

    @SuppressWarnings("unused")
    public static final Parcelable.Creator<Article> CREATOR = new Parcelable.Creator<Article>() {
        @Override
        public Article createFromParcel(Parcel in) {
            return new Article(in);
        }

        @Override
        public Article[] newArray(int size) {
            return new Article[size];
        }
    };
}

以下文章回复类

公共类文章回应{

@SerializedName("status")
@Expose
private String status;
@SerializedName("totalResults")
@Expose
private Integer totalResults;
@SerializedName("articles")
@Expose
private List<Article> articles = null;

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public Integer getTotalResults() {
    return totalResults;
}

public void setTotalResults(Integer totalResults) {
    this.totalResults = totalResults;
}

public List<Article> getArticles() {
    return articles;
}

public void setArticles(List<Article> articles) {
    this.articles = articles;
}

}

低于源模型类别

public class Source {

    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("name")
    @Expose
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

低于世界新闻级 公共级世界新闻{

@SerializedName("status")
@Expose
private String status;
@SerializedName("totalResults")
@Expose
private Integer totalResults;
@SerializedName("articles")
@Expose
private List<Article> articles = null;

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public Integer getTotalResults() {
    return totalResults;
}

public void setTotalResults(Integer totalResults) {
    this.totalResults = totalResults;
}

public List<Article> getArticles() {
    return articles;
}

public void setArticles(List<Article> articles) {
    this.articles = articles;
}

}


共 (3) 个答案

  1. # 1 楼答案

    Article article = new Article(Parcel.obtain());
    

    返回空的Article,因为Parcel.obtain()是空的Parcel。创建一个Article例如:

    Article article = new Article(Parcel.obtain());
    article.setUrl("https://google.com");
    

    然后打电话

    i.putExtra("myDataKey", article);
    

    而不是i.putExtra("myDataKey", article.getUrl());

    在{}的{}调用

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.detail_activity);
        ButterKnife.bind(this);
        Article object = (Article) getIntent().getParcelableExtra("myDataKey");
        article_webview.getSettings().setJavaScriptEnabled(true);
        article_webview.setWebViewClient(new WebViewClient());
        article_webview.loadUrl(object.getUrl());
    
    } 
    

    更新:

    MainActivity中删除startActivity(i)调用,并将此行添加到NewsAdapter的onClick()回调中:

    intent.putExtra("myDataKey", article);
    

    这将传递articleDetailActivity

  2. # 2 楼答案

    您正在从MainActivity传递url(请检查此行)

    i.putExtra("myDataKey", article.getUrl());
    

    因此,您将在下一个类中只获得url,而不是整个对象

    请替换以下行

    Article object = (Article) getIntent().getParcelableExtra("myDataKey"); article_webview.getSettings().setJavaScriptEnabled(true);
    article_webview.loadUrl("myDataKey");
    

    为此:

    String url = getIntent().getStringExtra("myDataKey");
     article_webview.getSettings().setJavaScriptEnabled(true);
    article_webview.loadUrl(url);
    
  3. # 3 楼答案

    请尝试“getUrl().toString”