从getIntent.getParcelableExtra中的文本视图获取值时出错

问题描述 投票:0回答:1

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

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void com.example.idstream.pojo.Movies.setTitle(java.lang.String)'在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));

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

这是我的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);
}

}

我的MoviesDetailActivity.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);
}
java android search themoviedb-api
1个回答
0
投票

我相信问题在这里:

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接口,这样就不必费心将所有字段一一添加。

© www.soinside.com 2019 - 2024. All rights reserved.