我正在尝试执行 Intent,但是在启动 Intent 时它给了我一个错误,它向我显示以下错误:
尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName()”
我不知道为什么当我调用我的意图时会发生此错误,这是我尝试执行我的意图的方法:
public void vistaDetalle(String tituloNoticia, String subtituloNoticia, String imagenNoticia, String descripcionNoticia, Context context, Activity activity) {
Intent intent = new Intent(getContext(), DescripcionNoticias.class);
intent.putExtra("titulon",tituloNoticia);
intent.putExtra("descripcionn", descripcionNoticia);
intent.putExtra("imagen", imagenNoticia);
startActivity(intent);
getActivity().overridePendingTransition(R.anim.left_in, R.anim.left_out);
}
我已经尝试使用 getActivity() 和其他方法,但没有一个对我有用,这是完整的类:
public class Inicio extends Fragment implements noticiasAdapter.OnEventMovieListener, Response.Listener<JSONObject>, Response.ErrorListener{
RecyclerView recyclerView;
private List<Noticias> noticias;
private noticiasAdapter noticiasadapter;
public static final String TAG = Noticias.class.getName();
RequestQueue request;
JsonObjectRequest jsonObjectRequest;
Context contextApp;
public Inicio(){
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.contextApp = context;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
View view = inflater.inflate(R.layout.inicio, container, false);
recyclerView = (RecyclerView)view.findViewById(R.id.recycler_view);
noticias = new ArrayList<>();
noticiasadapter = new noticiasAdapter(noticias);
noticiasadapter.setOnEventMovieListener(this);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
request = Volley.newRequestQueue(getActivity());
cargarWebService();
return view;
}
private void cargarWebService() {
String url = "http://192.168.1.81:80/webservicemgrex/listaNoticias.php";
jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,url,null,this,this);
request.add(jsonObjectRequest);
}
@Override
public void onResponse(JSONObject response) {
Noticias news = null;
JSONArray json = response.optJSONArray("inicio");
try{
for (int i=0; i<json.length(); i++){
news = new Noticias();
JSONObject jsonObject = null;
jsonObject = json.getJSONObject(i);
news.setIdNoticia(jsonObject.optInt("idNoticia"));
news.setTituloNoticia(jsonObject.optString("tituloNoticia"));
news.setSubtituloNoticia(jsonObject.getString("subtituloNoticia"));
news.setImagenNoticia(jsonObject.getString("imagenNoticia"));
news.setDescripcionNoticia(jsonObject.getString("descripcionNoticia"));
noticias.add(news);
}
noticiasAdapter adapter = new noticiasAdapter(noticias);
recyclerView.setAdapter(adapter);
noticiasadapter.notifyDataSetChanged();
}catch (JSONException e){
Toast.makeText(getActivity(),"Error al cargar la informacion del servidor: "+e, Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity(),"No se pudo consultar los registros: "+error.toString(), Toast.LENGTH_LONG).show();
Log.i("Error","No se pudo consultar el registro: "+error.toString());
}
public void vistaDetalle(String tituloNoticia, String subtituloNoticia, String imagenNoticia, String descripcionNoticia, Context context, Activity activity) {
Intent intent = new Intent(getContext(), DescripcionNoticias.class);
intent.putExtra("titulon",tituloNoticia);
intent.putExtra("descripcionn", descripcionNoticia);
intent.putExtra("imagen", imagenNoticia);
startActivity(intent);
getActivity().overridePendingTransition(R.anim.left_in, R.anim.left_out);
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
这是我调用它的类,当执行 onclick 时,我尝试调用我的 ViewDetail 方法:
public class noticiasAdapter extends RecyclerView.Adapter<noticiasAdapter.NoticiasViewHolder> {
private List<Noticias> noticias;
private OnEventMovieListener onEventMovieListener;
private Context context;
public Activity activity;
public interface OnEventMovieListener{
}
public class NoticiasViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener, View.OnClickListener {
TextView tituloNoticia;
TextView subtituloNoticia;
ImageView imagenNoticia;
TextView descripcionNoticia;
FloatingActionButton favoritos;
Button showMore;
private int contador = 0;
public NoticiasViewHolder(View itemView){
super(itemView);
tituloNoticia = (TextView)itemView.findViewById(R.id.tituloNoticia);
subtituloNoticia = (TextView)itemView.findViewById(R.id.subtituloNoticia);
imagenNoticia = (ImageView)itemView.findViewById(R.id.imagenNotica);
descripcionNoticia = (TextView)itemView.findViewById(R.id.descripcionNoticias);
favoritos = (FloatingActionButton)itemView.findViewById(R.id.floatingActionButton);
favoritos.setOnClickListener(this);
showMore = (Button)itemView.findViewById(R.id.showMore);
showMore.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.floatingActionButton:
if (contador == 0){
favoritos.setImageResource(R.drawable.likedcolor);
contador = contador + 1;
Noticias fav = noticias.get(getAdapterPosition());
noticiasWebService noti = new noticiasWebService();
noti.update(fav.getTituloNoticia(), fav.getSubtituloNoticia(), fav.getImagenNoticia(), fav.getDescripcionNoticia(), context);
Toast.makeText(context, "Se añadio a tus favoritos ", Toast.LENGTH_LONG).show();
}else if (contador == 1){
favoritos.setImageResource(R.drawable.unliked);
contador = contador - 1;
Noticias fav = noticias.get(getAdapterPosition());
noticiasWebService noti = new noticiasWebService();
noti.deleteRegistro(fav.getTituloNoticia(), context);
Toast.makeText(context, "Se elimino de tus favoritos", Toast.LENGTH_LONG).show();
}
break;
case R.id.showMore:
Noticias news = noticias.get(getAdapterPosition());
Inicio inicio = new Inicio();
inicio.vistaDetalle(news.getTituloNoticia(), news.getSubtituloNoticia(), news.getImagenNoticia(), news.getDescripcionNoticia(),context, activity );
break;
default:
break;
}
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
}
}
public noticiasAdapter(List<Noticias> noticias){
this.noticias = noticias;
}
@Override
public NoticiasViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_noticias, parent, false);
context = parent.getContext();
return new NoticiasViewHolder(itemView);
}
@Override
public void onBindViewHolder(NoticiasViewHolder holder, int position){
Noticias news = noticias.get(position);
holder.tituloNoticia.setText(news.getTituloNoticia());
holder.subtituloNoticia.setText(news.getSubtituloNoticia());
final String url = new String(news.getImagenNoticia());
if(url.isEmpty()){
Picasso.with(context).load(R.drawable.nofound).into(holder.imagenNoticia);
}else {
Picasso.with(context).load(url).into(holder.imagenNoticia);
}
holder.descripcionNoticia.setText(news.getDescripcionNoticia());
}
@Override
public int getItemCount(){
return noticias.size();
}
public OnEventMovieListener getOnEventMovieListener() {
return onEventMovieListener;
}
public void setOnEventMovieListener(OnEventMovieListener onEventMovieListener){
this.onEventMovieListener = onEventMovieListener;
}
}
这是方法:
case R.id.showMore:
Noticias news = noticias.get(getAdapterPosition());
Inicio inicio = new Inicio();
inicio.vistaDetalle(news.getTituloNoticia(), news.getSubtituloNoticia(), news.getImagenNoticia(), news.getDescripcionNoticia(),context, activity );
break;
default:
break;
这是我试图调用 NewsDescription.class 的类:
公共类 NewsDescription 扩展 AppCompatActivity {
TextView tituloNoticiaDescripcion;
TextView noticiaCompleta;
ImageView imagenNoticiaCompleta;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_descripcion_noticias);
//Toolbar de la aplicacion en la vista principal
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setTitle("Sección 15");
toolbar.setSubtitle("Nota completa");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
String tituloNoticia = getIntent().getExtras().getString("titulon");
String descripcionNoticia = getIntent().getExtras().getString("descripcionn");
String imagenNoticia = getIntent().getExtras().getString("imagen");
tituloNoticiaDescripcion = (TextView)findViewById(R.id.tituloDesNoticia);
noticiaCompleta = (TextView)findViewById(R.id.noticiaCompleta);
imagenNoticiaCompleta = (ImageView)findViewById(R.id.imagenNoticiaCompleta);
tituloNoticiaDescripcion.setText(tituloNoticia);
noticiaCompleta.setText(descripcionNoticia);
imagenNoticiaCompleta.setImageResource(R.drawable.noticiauno);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
overridePendingTransition(R.anim.left_out, R.anim.left_in);
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
}
这是完整的错误:
从片段开始活动。
如果你想从一个 Fragment 中打开一个 Activity,你必须使用 as context
getActivity()
,这样你就可以得到包含这个 Fragment 的 Activity 的上下文。例子:
显然,
Activity
要启动的必须在您的文件中注册AndroidManifest.xml
如果您在使用它时遇到错误,
getActivity()
可能是由其他原因引起的,您应该查看该LogCat
信息并将该信息添加到您的问题中。我已经解决了,我唯一做的就是将方法更改为适配器,然后通过以下方式传递上下文:
我创建一个变量
私有上下文上下文;
在 onCreateViewHolder 方法中,我分配了以下值:
上下文 = parent.getContext();
在我执行意图的方法中,我只传递了contex变量:
如果你从片段中投射它,试试这个:
如果您从 Activity 启动它,它将是: