Ошибка при получении значения из текстовых представлений в getIntent.getParcelableExtra - PullRequest
0 голосов
/ 09 января 2020

В эти дни я работал с проектом android, и он скоро закончится sh, но я застрял в своем проекте. Во-первых, я хочу создать поисковую активность, которая будет использоваться для поиска фильмов. Операция поиска работает хорошо, но когда бы она ни добавляла выбранное mov ie, она показывала мне код ошибки ниже:

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));

Я пытался добавить выбранный mov ie в базу данных в другой деятельности, но в ней не упоминалось ни одной ошибки. Но когда я пытался сохранить выбранный mov ie в базу данных, это выдает ошибку. Я также попытался отправить его на тост, который я хочу убедиться, что полученное мной значение было успешно получено. Тост успешно получил данные.

Вот мой 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);
}

}

My 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);
}

1 Ответ

1 голос
/ 09 января 2020

Я считаю, что проблема здесь:

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 класса, и тогда вам не нужно будет добавлять все его поля одно за другим.

...