为什么在 onClick 方法中通过 Intent 传递数据时开始第二个 Activity 崩溃
Why starting a second Activity crashes while passing data via Intent in onClick method
在这里,在我的自定义适配器 class 中,当我跟踪我在按下图像后发现的错误时,它成功地通过了 onClick 方法,达到了目的,但是当它崩溃时尝试启动第二个 Activity.
package com.example.prof_mohamed.movieapp;
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Prof-Mohamed on 8/3/2016.
*/
public class ImagesAdapter extends RecyclerView.Adapter<ImagesAdapter.ViewHOlder> {
private List<MovieEntity> feedItemList;
private Context mContext;
public ImagesAdapter(Context context, ArrayList<MovieEntity> feedItemList) {
this.feedItemList=feedItemList;
this.mContext= context;
}
@Override
public ImagesAdapter.ViewHOlder onCreateViewHolder(ViewGroup parent, int i) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout, null);
RecyclerView.ViewHolder viewHolder=new ViewHOlder(view);
return (ViewHOlder) viewHolder;
}
@Override
public void onBindViewHolder(ViewHOlder customViewholder, final int i) {
final MovieEntity feedItem=feedItemList.get(i);
Picasso.with(mContext).load(feedItem.getPOSTER_PATH_STRING()).into(customView holder.one_img);
customViewholder.one_text.setText(feedItem.getTITLE_STRING());
customViewholder.one_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext,DetailActivity.class)
.putExtra(Intent.EXTRA_TEXT,feedItem);
mContext.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return (null!=feedItemList?feedItemList.size():0);
}
public class ViewHOlder extends RecyclerView.ViewHolder {
protected ImageView one_img;
protected TextView one_text;
public ViewHOlder(View converview) {
super(converview);
this.one_img = (ImageView) converview.findViewById(R.id.img_view);
this.one_text = (TextView) converview.findViewById(R.id.txt_poster_title);
}
}
}
这是我的第二个 Activity,我必须将第一个 Activity 的数据发送给它:
package com.example.prof_mohamed.movieapp;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class DetailActivity extends AppCompatActivity {
private static String mMovieStr;
TextView txtTitle=(TextView) findViewById(R.id.txt_title);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
Intent intent = getIntent();
if(intent != null&&intent.hasExtra(intent.EXTRA_TEXT)){
mMovieStr=intent.getStringExtra(intent.EXTRA_TEXT);
txtTitle.setText(mMovieStr);
}
}
}
这是我的错误结果:
E/AndroidRuntime:致命异常:main
android.util.AndroidRuntimeException:从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗?
在 android.app.ContextImpl.startActivity(ContextImpl.java:1278)
在 android.app.ContextImpl.startActivity(ContextImpl.java:1265)
在 com.example.prof_mohamed.movieapp.ImagesAdapter$1.onClick(ImagesAdapter.java:52)
在 android.view.View.performClick(View.java:4432)
在 android.view.View$PerformClick.run(View.java:18339)
在 android.os.Handler.handleCallback(Handler.java:725)
在 android.os.Handler.dispatchMessage(Handler.java:92)
在 android.os.Looper.loop(Looper.java:137)
在 android.app.ActivityThread.main(ActivityThread.java:5283)
在 java.lang.reflect.Method.invokeNative(本机方法)
在 java.lang.reflect.Method.invoke(Method.java:511)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
在 dalvik.system.NativeStart.main(本机方法)
在 onClick 方法中编辑这些行后
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext,DetailActivity.class)
.putExtra(Intent.EXTRA_TEXT,feedItem);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
它给了我 DetailActivity.java class 中的 txtTitle (TextView) 的空指针异常。
谁能帮我解决这个问题。您的回复将不胜感激。
请检查您在清单文件中定义的 DetailActivity。
试试这个:
Intent intent = new Intent(mContext,DetailActivity.class)
.putExtra(Intent.EXTRA_TEXT,feedItem);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
尝试在创建意图后添加以下代码
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
在你的适配器中 class 你正在传递对象,但在第二个 activity 你试图 getStringExtra()
阅读这篇文章会有帮助
How to send an object from one Android Activity to another using Intents?
feedItem 是一个对象。您有意传递它并试图从第二个 activity 获取它作为字符串,这就是问题所在。
在这里,在我的自定义适配器 class 中,当我跟踪我在按下图像后发现的错误时,它成功地通过了 onClick 方法,达到了目的,但是当它崩溃时尝试启动第二个 Activity.
package com.example.prof_mohamed.movieapp;
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Prof-Mohamed on 8/3/2016.
*/
public class ImagesAdapter extends RecyclerView.Adapter<ImagesAdapter.ViewHOlder> {
private List<MovieEntity> feedItemList;
private Context mContext;
public ImagesAdapter(Context context, ArrayList<MovieEntity> feedItemList) {
this.feedItemList=feedItemList;
this.mContext= context;
}
@Override
public ImagesAdapter.ViewHOlder onCreateViewHolder(ViewGroup parent, int i) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout, null);
RecyclerView.ViewHolder viewHolder=new ViewHOlder(view);
return (ViewHOlder) viewHolder;
}
@Override
public void onBindViewHolder(ViewHOlder customViewholder, final int i) {
final MovieEntity feedItem=feedItemList.get(i);
Picasso.with(mContext).load(feedItem.getPOSTER_PATH_STRING()).into(customView holder.one_img);
customViewholder.one_text.setText(feedItem.getTITLE_STRING());
customViewholder.one_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext,DetailActivity.class)
.putExtra(Intent.EXTRA_TEXT,feedItem);
mContext.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return (null!=feedItemList?feedItemList.size():0);
}
public class ViewHOlder extends RecyclerView.ViewHolder {
protected ImageView one_img;
protected TextView one_text;
public ViewHOlder(View converview) {
super(converview);
this.one_img = (ImageView) converview.findViewById(R.id.img_view);
this.one_text = (TextView) converview.findViewById(R.id.txt_poster_title);
}
}
}
这是我的第二个 Activity,我必须将第一个 Activity 的数据发送给它:
package com.example.prof_mohamed.movieapp;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class DetailActivity extends AppCompatActivity {
private static String mMovieStr;
TextView txtTitle=(TextView) findViewById(R.id.txt_title);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
Intent intent = getIntent();
if(intent != null&&intent.hasExtra(intent.EXTRA_TEXT)){
mMovieStr=intent.getStringExtra(intent.EXTRA_TEXT);
txtTitle.setText(mMovieStr);
}
}
}
这是我的错误结果:
E/AndroidRuntime:致命异常:main android.util.AndroidRuntimeException:从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK 标志。这真的是你想要的吗? 在 android.app.ContextImpl.startActivity(ContextImpl.java:1278) 在 android.app.ContextImpl.startActivity(ContextImpl.java:1265) 在 com.example.prof_mohamed.movieapp.ImagesAdapter$1.onClick(ImagesAdapter.java:52) 在 android.view.View.performClick(View.java:4432) 在 android.view.View$PerformClick.run(View.java:18339) 在 android.os.Handler.handleCallback(Handler.java:725) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5283) 在 java.lang.reflect.Method.invokeNative(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 在 dalvik.system.NativeStart.main(本机方法)
在 onClick 方法中编辑这些行后
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext,DetailActivity.class)
.putExtra(Intent.EXTRA_TEXT,feedItem);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
它给了我 DetailActivity.java class 中的 txtTitle (TextView) 的空指针异常。
谁能帮我解决这个问题。您的回复将不胜感激。
请检查您在清单文件中定义的 DetailActivity。
试试这个:
Intent intent = new Intent(mContext,DetailActivity.class)
.putExtra(Intent.EXTRA_TEXT,feedItem);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
尝试在创建意图后添加以下代码
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
在你的适配器中 class 你正在传递对象,但在第二个 activity 你试图 getStringExtra()
阅读这篇文章会有帮助
How to send an object from one Android Activity to another using Intents?
feedItem 是一个对象。您有意传递它并试图从第二个 activity 获取它作为字符串,这就是问题所在。