java - Intent putExtra() 不起作用

标签 java android android-fragments android-intent

嗨,我的 MainActivity我实现了ViewPagerTabLayout有 3 个选项卡,每个 View 页面都会启动新的 Fragment。我在每个 fragment 的 GridView 中显示卡片,当单击卡片时 DetailActivtiy开始。 我正在从 fragment 开始详细 Activity ,但是当我尝试在 Intent 中添加一些额外内容时开始详细 Activity 我得到 NullPointerException 。我尝试调试代码,但无法找到问题所在。

这是我的代码:

PopularFragment (3 个选项卡中的其中一个选项卡布局)

public class PopularFragment extends Fragment implements PosterTask.GetPoster,RecyclerAdapter.OnClick {
private RecyclerAdapter mRecyclerAdapter;
private ProgressDialog mProgressBar;
private ArrayList<Movie> movies;

public PopularFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_popular, container, false);
    //Show progress bar
     showProgressBar();
     RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
    //Setting layout manager
    recyclerView.setLayoutManager(new GridLayoutManager(inflater.getContext(), 2));
    //Setting adapter
    mRecyclerAdapter = new RecyclerAdapter(inflater.getContext());
    recyclerView.setAdapter(mRecyclerAdapter);
    return view;
}

@Override
public void onStart() {
    super.onStart();
    //Starting asyncTask
    new PosterTask(this).execute(buildUrl().toString());
    //Setting listener to cards
    mRecyclerAdapter.setOnClickListener(this);
}

//Building url
private Uri buildUrl(){
    //Building url
    String api_key = "api_key";
    return Uri.parse(Utility.POPULAR_URL).buildUpon()
            .appendQueryParameter(api_key, getString(R.string.API_KEY))
            .build();
}

//Called after getting posters url's
@Override
public void onPosterCompleted(ArrayList<Movie> movies) {
    ArrayList<String> poster = new ArrayList<>();
    for(int i=0;i<movies.size();i++){
        poster.add(movies.get(i).getPoster());
    }
  //Passing data to adapter
    mRecyclerAdapter.setPoster(poster);
    //Removing progress bar
    mProgressBar.hide();
    this.movies = movies;
}

//Showing progress bar
private void showProgressBar(){
    mProgressBar = new ProgressDialog(getContext());
    mProgressBar.setMessage("Fetching data...");
    mProgressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    mProgressBar.show();
}

@Override
public void onClicked(int position, View v) {
    //Starting detail activity
    Intent intent = new Intent(getActivity(), DetailActivity.class);
    intent.putExtra(Utility.INTENT_CONSTANT, "sahil");
    startActivity(intent);
}
}

这里onClicked()RecyclerView中的任何一张卡时调用该方法被点击。 RecyclerAdapter :

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private Context mContext;
private ArrayList<String> mPosters;
private static OnClick mListener;

//Listener listening clicks
public interface OnClick{
    void onClicked(int position, View v);
}

public RecyclerAdapter(Context context){
    mContext = context;
}

//Set poster url
public void setPoster(ArrayList<String> poster){
    mPosters = poster;
    notifyDataSetChanged();
}

//Set listener
public void setOnClickListener(OnClick listener){
    mListener = listener;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view =  LayoutInflater.from(mContext).inflate(R.layout.card_layout, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    //Loading url images to image view in cards
    Picasso.with(mContext).load(mPosters.get(position)).into(holder.imageView);
}

@Override
public int getItemCount() {
    if(mPosters!=null) {
        return mPosters.size();
    }
    return 0;
}

//View holder for adapter
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    private ImageView imageView;

    public ViewHolder(View itemView) {
        super(itemView);
        imageView = (ImageView) itemView.findViewById(R.id.card_image);
        imageView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        mListener.onClicked(getPosition(), v);
    }
}
}

当我开始DetailActivity无需额外投入Intent它有效,但是当我额外投入 Intent 时并尝试在 DetailActivity 中检索它我得到NullPointerException 。 在 DetailFragment (由DetailActivity包含,我试图获得 Intent ):

//Exception:Detailfragment:
public class DetailFragment extends Fragment implements TrailerRecyclerAdapter.OnClick,TrailerTask.TrailerCompleted {
@Bind(R.id.movie_title)TextView titleView;
@Bind(R.id.movie_date)TextView dateView;
@Bind(R.id.movie_image)ImageView imageView;
@Bind(R.id.movie_vote_avg)TextView voteView;
@Bind(R.id.movie_votes)TextView totalView;
@Bind(R.id.favorite_button)Button favButton;
@Bind(R.id.trailer_view)RecyclerView trailerView;
@Bind(R.id.review_view)RecyclerView reviewView;
private TrailerRecyclerAdapter mTrailerAdapter;
private ArrayList<String> mTrailers;

public DetailFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_detail, container, false);
    //Binding views
    ButterKnife.bind(this, view);
    //Getting clicked movie
 //   Movie movie = getActivity().getIntent().getParcelableExtra(Utility.INTENT_CONSTANT);
    //Starting asyncTask
 //   new TrailerTask(this).execute(movie.getId());
    //Binding data
 //   bindData(movie);
    Log.v("title", getActivity().getIntent().getStringExtra(Utility.INTENT_CONSTANT));
    return view;
}

//Binds data to views
/*
private void bindData(Movie movie){
    titleView.setText(movie.getTitle());
    dateView.setText(movie.getDate());
    Picasso.with(getContext()).load(movie.getBack_poster()).into(imageView);
    voteView.setText(String.valueOf(movie.getVote_avg()));
    String total = getString(R.string.before) + movie.getTotal_votes() + getString(R.string.after);
    totalView.setText(total);
    //Setting adapter to trailerView
    mTrailerAdapter = new TrailerRecyclerAdapter(getContext());
    trailerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
    trailerView.setAdapter(mTrailerAdapter);
}
*/

@Override
public void onClicked(int position, View v) {
 //Building intent
    Uri uri = Uri.parse(mTrailers.get(position)).buildUpon().build();
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(uri);
    if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
        startActivity(intent);
    }
}

@Override
public void onTrailerCompleted(ArrayList<String> trailers, ArrayList<String> trailer_posters) {
    mTrailers = trailers;
    mTrailerAdapter.setPoster(trailer_posters);
}
}

这是Github repo

日志猫:

E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: com.example.android.movies, PID: 14578
                                                                        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.movies/com.example.android.movies.DetailActivity}: android.view.InflateException: Binary XML file line #1: Error inflating class fragment
                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2338)
                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
                                                                            at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:110)
                                                                            at android.os.Looper.loop(Looper.java:193)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5292)
                                                                            at java.lang.reflect.Method.invokeNative(Native Method)
                                                                            at java.lang.reflect.Method.invoke(Method.java:515)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
                                                                            at dalvik.system.NativeStart.main(Native Method)
                                                                         Caused by: android.view.InflateException: Binary XML file line #1: Error inflating class fragment
                                                                            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
                                                                            at android.view.LayoutInflater.parseInclude(LayoutInflater.java:816)
                                                                            at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
                                                                            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
                                                                            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
                                                                            at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
                                                                            at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256)
                                                                            at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
                                                                            at com.example.android.movies.DetailActivity.onCreate(DetailActivity.java:14)
                                                                            at android.app.Activity.performCreate(Activity.java:5292)
                                                                            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302)
                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
                                                                            at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
                                                                            at android.os.Handler.dispatchMessage(Handler.java:110) 
                                                                            at android.os.Looper.loop(Looper.java:193) 
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5292) 
                                                                            at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                            at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
                                                                            at dalvik.system.NativeStart.main(Native Method) 
                                                                         Caused by: java.lang.NullPointerException: println needs a message
                                                                            at android.util.Log.println_native(Native Method)
                                                                            at android.util.Log.v(Log.java:118)
                                                                            at com.example.android.movies.DetailFragment.onCreateView(DetailFragment.java:54)
                                                                            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
                                                                            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1036)
                                                                            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1226)
                                                                            at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1328)
                                                                            at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2284)
                                                                            at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
                                                                            at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:314)
                                                                            at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)
                                                                            at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79)
                                                                            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
                                                                            at android.view.LayoutInflater.parseInclude(LayoutInflater.java:816) 
                                                                            at android.view.LayoutInflater.rInflate(LayoutInflater.java:745) 
                                                                            at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
                                                                            at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
                                                                            at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
                                                                            at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256) 
                                                                            at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109) 
                                                                            at com.example.android.movies.DetailActivity.onCreate(DetailActivity.java:14) 
                                                                            at android.app.Activity.performCreate(Activity.java:5292) 
                                                                            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088) 
                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302) 
                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
                                                                            at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
                                                                            at android.os.Handler.dispatchMessage(Handler.java:110) 
                                                                            at android.os.Looper.loop(Looper.java:193) 
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5292) 
                                                                            at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                            at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
                                                                            at dalvik.system.NativeStart.main(Native Method) 

最佳答案

您不应使用静态变量来保存 RecyclerAdapter 中的回调监听器。这意味着当您希望每个 RecyclerAdapter 都有自己的回调监听器时,每个 RecyclerAdapter 将始终具有相同的回调监听器。

这就是您遇到此问题的原因。 RatedFragmentPopularFragment 都使用 RecyclerAdapter。当您单击图像时,即使在查看 PopulareFragmnet 时,也会调用 RatedFragment 的回调。

RatedFragment 然后不会添加您正在查找的导致 NullPointerException 的额外内容。

要解决此问题,请从 RecyclerAdapter 中的 mListener 中删除静态:

private OnClick mListener;

然后从 ViewHolder 类的定义中删除 static,使其成为内部类并可以直接访问监听器:

public class ViewHolder extends RecyclerView.ViewHolder
       implements View.OnClickListener {

完成此操作后,您仍然需要修复 RatedFragment,因为它将显示相同的 DetailsFragment,而无需您当前需要的额外内容。

关于java - Intent putExtra() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35817500/

相关文章:

java - PreferenceActivity 子类不应在 list 中导出 (ExportedPreferenceActivity)

java - 调用并使用 .interrupt() 方法?

android - Android 上的 Boost.Asio 因找不到服务而失败(Boost 1.53;NDK r8e)

android - 有没有办法使用谷歌文档读取本地pdf文件

android - 将 zxing 条码扫描器切换到纵向模式

java - 如何更新包中的参数

较低 API 上的 Android Fragments

java - Struts 2 和 Hibernate 中的异常处理

java - 用 java 函数转置 double[][] 矩阵?

java - Spring 注入(inject)中的循环依赖 - 这是糟糕的设计吗?