首页 > 解决方案 > 从 getIntent.getParcelableExtra 中的文本视图获取值时出错

问题描述

这些天我正在使用android项目,它很快就会完成,但我被困在我的项目中。首先,我想创建将用于搜索电影的搜索活动。搜索活动运行良好,但每当添加所选电影时,它都会向我显示以下错误代码:

java.lang.NullPointerException:尝试在 com.example.idstream.search.MoviesDetailActivity.addFavorite( MoviesDetailActivity.java:96) 在 com.example.idstream.search.MoviesDetailActivity.access$100(MoviesDetailActivity.java:19) 在 com.example.idstream.search.MoviesDetailActivity$1.onClick(MoviesDetailActivity.java:78)

此代码在此区域有错误:

Movies movies = getIntent().getParcelableExtra(EXTRA_TITLE);
movies.setTitle(getIntent().getStringExtra(EXTRA_TITLE));
movies.setRelease_info(getIntent().getStringExtra(EXTRA_RELEASE));
movies.setLanguage(getIntent().getStringExtra(EXTRA_LANGUAGE));
movies.setDescription(getIntent().getStringExtra(EXTRA_OVERVIEW));
movies.setPhotos(getIntent().getStringExtra(EXTRA_PHOTOS));

我尝试在其他活动中将所选电影添加到数据库中,但没有提及任何错误。但是当我尝试将所选电影保存到数据库时,结果出现错误。我还尝试将它发送到 toast,我想确定我发送的值是否已成功检索。toast 成功获取数据。

这是我的 SearchFragment.java:

public class SearchMovieFragment extends Fragment implements LoaderManager.LoaderCallbacks<ArrayList<Movies>>  {

ListView lvMovieItems;
EditText txtTitleMovieInput;
ImageView imgMoviesSearch;
Button btnSearchMovie;
AdaptersMovie adaptersMovie;
MovieHelper movieHelper;
Boolean act = true;
Boolean insert = true;
Boolean delete = true;
private View mView;

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mView = inflater.inflate(R.layout.fragment_search_movie, container, false);
    txtTitleMovieInput   = (EditText)mView.findViewById(R.id.txtMovieTitle);
    String mTitles = txtTitleMovieInput.getText().toString();
    Bundle bundle = new Bundle();
    bundle.putString(EXTRA_MOVIE, mTitles);

    imgMoviesSearch   = (ImageView)mView.findViewById(R.id.imgMovies);
    btnSearchMovie     = (Button) mView.findViewById(R.id.btn_search);

    btnSearchMovie.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String mTitleMovie = txtTitleMovieInput.getText().toString();
            if(TextUtils.isEmpty(mTitleMovie)){
                return;
            }
            Bundle bundle = new Bundle();
            bundle.putString(EXTRA_MOVIE, mTitleMovie);
            getLoaderManager().restartLoader(0, bundle, SearchMovieFragment.this);
        }
    });

    getLoaderManager().initLoader(0, bundle, SearchMovieFragment.this);
    adaptersMovie     = new AdaptersMovie(getActivity());
    adaptersMovie.notifyDataSetChanged();
    lvMovieItems    = (ListView)mView.findViewById(R.id.listMovies);
    lvMovieItems.setAdapter(adaptersMovie);
    lvMovieItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Movies item = (Movies)parent.getItemAtPosition(position);
            Intent intent = new Intent(getActivity(), MoviesDetailActivity.class);
            intent.putExtra(MoviesDetailActivity.EXTRA_MOVIE, item.getTitle());
            intent.putExtra(MoviesDetailActivity.EXTRA_RELEASE, item.getRelease_info());
            intent.putExtra(MoviesDetailActivity.EXTRA_LANGUAGE, item.getLanguage());
            intent.putExtra(MoviesDetailActivity.EXTRA_OVERVIEW, item.getDescription());
            intent.putExtra(MoviesDetailActivity.EXTRA_PHOTOS, item.getPhotos());
            startActivity(intent);
        }
    });
    return mView;
}

@NonNull
@Override
public Loader<ArrayList<Movies>> onCreateLoader(int id, @Nullable Bundle args) {
    String temp = "";
    if (args != null){
        temp = args.getString(EXTRA_MOVIE);
    }
    return new MovieAsyncTaskLoader(getActivity(), temp);
}

@Override
public void onLoadFinished(@NonNull Loader<ArrayList<Movies>> loader, ArrayList<Movies> data) {
    adaptersMovie.setData(data);
}

@Override
public void onLoaderReset(@NonNull Loader<ArrayList<Movies>> loader) {
    adaptersMovie.setData(null);
}

}

我的电影DetailActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_movies_detail);

    setTitle("Movie's Details");
    tvTitles = findViewById(R.id.movieTitles);
    tvReleased = findViewById(R.id.movieRelease);
    tvLanguages = findViewById(R.id.movieLanguages);
    tvDescription = findViewById(R.id.movieDescriptions);
    imageMovies = findViewById(R.id.moviesImage);
    progressBar = findViewById(R.id.progressMovie);
    fav_moviesBtn = findViewById(R.id.fab_movie);
    progressBar.setVisibility(View.VISIBLE);

    String mvTitles = getIntent().getStringExtra(EXTRA_MOVIE);
    String mvLanguages = getIntent().getStringExtra(EXTRA_LANGUAGE);
    String mvOverview = getIntent().getStringExtra(EXTRA_OVERVIEW);
    String mvRelease = getIntent().getStringExtra(EXTRA_RELEASE);
    String mvPhotos = getIntent().getStringExtra(EXTRA_PHOTOS);

    tvTitles.setText(mvTitles);
    tvReleased.setText(mvRelease);
    tvLanguages.setText(mvLanguages);
    tvDescription.setText(mvOverview);
    Glide.with(MoviesDetailActivity.this)
            .load("https://image.tmdb.org/t/p/w185" + mvPhotos)
            .placeholder(R.color.colorFreshOrange)
            .dontAnimate()
            .into(imageMovies);

    movieHelper = new MovieHelper(MoviesDetailActivity.this);
    movieHelper.open();

    mMoviess = getIntent().getIntExtra(FAVOURITE,0);

    fav_moviesBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!isAdd) {
                addFavorite();
                Toast.makeText(MoviesDetailActivity.this, "Berhasil Ditambahkan", Toast.LENGTH_LONG).show();
                fav_moviesBtn.setImageResource(R.drawable.ic_launcher_fav_yes_24_foreground);
            } else {
                removeFavorite();
                Toast.makeText(MoviesDetailActivity.this, "Berhasil Dihapuskan", Toast.LENGTH_LONG).show();
                fav_moviesBtn.setImageResource(R.drawable.ic_launcher_fav_no_24_foreground);
            }
        }
    });

    progressBar.setVisibility(View.GONE);

}


private void addFavorite() {
    Movies movies = getIntent().getParcelableExtra(EXTRA_TITLE);
    movies.setTitle(getIntent().getStringExtra(EXTRA_TITLE));
    movies.setRelease_info(getIntent().getStringExtra(EXTRA_RELEASE));
    movies.setLanguage(getIntent().getStringExtra(EXTRA_LANGUAGE));
    movies.setDescription(getIntent().getStringExtra(EXTRA_OVERVIEW));
    movies.setPhotos(getIntent().getStringExtra(EXTRA_PHOTOS));
    movieHelper.insertMovie(movies);
}

private void removeFavorite() {

    Movies movies = new Movies();
    movies.setTitle(getIntent().getStringExtra(EXTRA_TITLE));
    movies.setRelease_info(getIntent().getStringExtra(EXTRA_RELEASE));
    movies.setLanguage(getIntent().getStringExtra(EXTRA_LANGUAGE));
    movies.setDescription(getIntent().getStringExtra(EXTRA_OVERVIEW));
    movies.setPhotos(getIntent().getStringExtra(EXTRA_PHOTOS));
    movieHelper.deleteMovie(getIntent().getStringExtra(EXTRA_MOVIE));
}

}

这个是我的 MovieHelper.java:

public Boolean getOne(String name){
    String querySingleRecord = "SELECT * FROM " + DATABASE_TABLE + " WHERE " +DatabaseContract.MovieColoumn.TITLE+ " " + " LIKE " +"'"+name+"'" ;
    Cursor cursor = database.rawQuery(querySingleRecord,null);
    cursor.moveToFirst();
    Log.d("cursor", String.valueOf(cursor.getCount()));
    if (cursor.getCount() > 0 ){
        return true;
    }else if(cursor.getCount() == 0){
        return false;
    }
    return false;
}

public long insertMovie(Movies mMovies){
    ContentValues args = new ContentValues();
    args.put(IDS,mMovies.getId());
    args.put(DatabaseContract.MovieColoumn.TITLE,mMovies.getTitle());
    args.put(DatabaseContract.MovieColoumn.RELEASE_INFO,mMovies.getRelease_info());
    args.put(DatabaseContract.MovieColoumn.LANGUAGE,mMovies.getLanguage());
    args.put(DatabaseContract.MovieColoumn.DESCRIPTION,mMovies.getDescription());
    args.put(DatabaseContract.MovieColoumn.PHOTOS,mMovies.getPhotos());
    return database.insert(DATABASE_TABLE,null,args);
}

标签: javaandroidsearchthemoviedb-api

解决方案


我相信问题出在这里:

Movies movies = getIntent().getParcelableExtra(EXTRA_TITLE);
movies.setTitle(getIntent().getStringExtra(EXTRA_TITLE));

请注意,您EXTRA_TITLE对两者都使用相同的。

我认为正在发生的事情是getParcelableExtra()正在返回null,因为Bundle(附加功能)的实现将捕获ClassCastException

// ...
try {
    return (T) o;
} catch (ClassCastException e) {
    typeWarning(key, o, "Parcelable", e);
    return null;
}

然后NullPointerException当你尝试调用时你会得到一个setTitle()

相反,Movies自己创建一个新实例:

Movies movies = new Movies();
movies.setTitle(getIntent().getStringExtra(EXTRA_TITLE));

或者,您可以Parcelable在您的类中实现该接口Movies,然后您就不必费心一一添加它的所有字段。


推荐阅读