[英]how can I pass data correctly from one activity to another?
Currently, I am developing a news app where I have implemented Webview but URL is not loading data and showing empty screen.目前,我正在开发一个新闻应用程序,我已经实现了 Webview,但 URL 没有加载数据并显示空屏幕。 I have followed some tutorial where it is possible to pass Objects using Intents Parcelable.我遵循了一些教程,其中可以使用 Intents Parcelable 传递对象。 What I wanted to achieve that when user clicks article items I want to show corresponding url show it web view using Parcelable but is showing a white screen.当用户单击文章项目时,我想实现什么我想显示相应的 url 使用 Parcelable 显示它的 web 视图,但显示白屏。
below my code from DetailActivity where I have implemented webview在我实现 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];
}
};
}
below My MainActivity class where I am passing parcelable object在我的 MainActivity 类下面,我在那里传递了 Parcelable 对象
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();
}
}
below my NewsAdapter class where I have implemented on item clicks listener and recyclerview在我的 NewsAdapter 类下面,我在那里实现了项目点击监听器和 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);
}
}
}
below my ending point class where I am getting each news在我收到每个新闻的终点课程下方
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();
}
below my Retrofit client class在我的改造客户端类下面
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 {
}
}
and cnn_fragment.xml where I have hosted recyclerview和 cnn_fragment.xml 我在其中托管了 recyclerview
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:id="@+id/recycler_view"
android:scrollbars="vertical"
android:layout_height="wrap_content"/>
</LinearLayout>
below BBCFragment where I have implemented BBCNews在 BBCFragment 下面我已经实施了 BBCNews
public class BBCFragment extends Fragment {公共类 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:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:id="@+id/recycler_view"
android:scrollbars="vertical"
android:layout_height="wrap_content"/>
</LinearLayout>
other fragment news the same as previous fragments其他片段消息与之前的片段相同
below Pojo Model classes在 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];
}
};
}
below article response class下面文章响应类
public class ArticleResponse {公共类文章响应{
@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;
}
} }
below Source model class下面源模型类
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;
}
}
below WorldNews class public class WorldNews {下面 WorldNews 类 public class WorldNews {
@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;
}
} }
You are just passing url from your MainActivity (check this line)您只是从 MainActivity 传递 url(检查此行)
i.putExtra("myDataKey", article.getUrl());
So you will get only the url in next class and not the whole object所以你只会得到下一堂课的 url 而不是整个对象
Please replace your following lines,请替换您的以下几行,
Article object = (Article) getIntent().getParcelableExtra("myDataKey"); article_webview.getSettings().setJavaScriptEnabled(true);
article_webview.loadUrl("myDataKey");
with this :有了这个 :
String url = getIntent().getStringExtra("myDataKey");
article_webview.getSettings().setJavaScriptEnabled(true);
article_webview.loadUrl(url);
Article article = new Article(Parcel.obtain());
returns an empty Article
because Parcel.obtain()
is an empty Parcel
.返回一个空的Article
因为Parcel.obtain()
是一个空的Parcel
。 Create an Article
for example like this:像这样创建一篇Article
:
Article article = new Article(Parcel.obtain());
article.setUrl("https://google.com");
Then call然后打电话
i.putExtra("myDataKey", article);
instead of i.putExtra("myDataKey", article.getUrl());
而不是i.putExtra("myDataKey", article.getUrl());
And in onCreate()
of DetailActivity
call并在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());
}
UPDATE:更新:
Remove startActivity(i)
call from MainActivity
, and add this line to onClick()
callback of NewsAdapter:从MainActivity
删除startActivity(i)
调用,并将此行添加到 NewsAdapter 的onClick()
回调中:
intent.putExtra("myDataKey", article);
This will pass article
to DetailActivity
.这会将article
传递给DetailActivity
。
请尝试“getUrl().toString”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.