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

Java 如何将数据正确地从一个活动传递到另一个活动?,java,android,webview,parcelable,Java,Android,Webview,Parcelable,目前,我正在开发一个新闻应用程序,我已经实现了Webview,但URL并没有加载数据并显示空屏幕。我已经学习了一些教程,其中可以使用Intent Parcelable传递对象。我想实现的是,当用户单击文章项时,我想使用Parcelable显示相应的url show it web视图,但显示的是白色屏幕 下面是我实施webview的DetailActivity中的代码 public class DetailActivity extends Activity{ @BindView(R.id.

目前,我正在开发一个新闻应用程序,我已经实现了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];
        }
    };
}
低于世界新闻级 公共级世界新闻{

@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;
}
@SerializedName(“状态”)
@暴露
私有字符串状态;
@SerializedName(“totalResults”)
@暴露
私有整数结果;
@序列化名称(“文章”)
@暴露
私有列表项目=null;
公共字符串getStatus(){
返回状态;
}
公共无效设置状态(字符串状态){
这个状态=状态;
}
公共整数getTotalResults(){
返回结果;
}
公共void setTotalResults(整数totalResults){
this.totalResults=totalResults;
}
公共列表getArticles(){
归还物品;
}
公共物品(列出物品){
这个.文章=文章;
}

}

您只是从MainActivity传递url(请勾选此行)

因此,您将在下一个类中只获得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);
返回一个空的
文章
,因为
包裹。获取()
是一个空的
包裹
。创建一篇
文章
,例如:

Article article = new Article(Parcel.obtain());
article.setUrl("https://google.com");
然后打电话

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

DetailActivity
调用的
onCreate()

@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);

这将把
文章
传递到
详细活动

请尝试“getUrl().toString”

您在发布的代码中没有实际使用url。所以这当然是一个空屏幕。@Gabeschen在这种情况下你的建议是什么?它不起作用,我已经按照你告诉我的那样做了,它显示为白色屏幕。在这种情况下,请检查你是否通过调试在另一个类中获得url,或者通过日志打印它,如果它起作用,还可以在chrome n chcek中打开该url。我已检查调试文章是否有效空,但url在Chrome上打开。您的建议是什么?在这种情况下,您将在Detailactivity检查中只得到url字符串,如果该字符串为空。@我不明白您在说什么
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;
}
i.putExtra("myDataKey", article.getUrl());
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);
Article article = new Article(Parcel.obtain());
Article article = new Article(Parcel.obtain());
article.setUrl("https://google.com");
i.putExtra("myDataKey", article);
@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());

} 
intent.putExtra("myDataKey", article);