Java Intent不从editText、android发送值
我正在尝试使用intents将参数从一个活动(ActividadInsercionObjeto)传递到另一个活动(DatoSensor),但我一直在尝试不退出。我不确定我做错了什么 我需要传递的值是photo.jpg中最后一个名为idObjeto的值。这个值来自一个与远程MySql同步的SQLite,因此当原始活动打开时,这些值会出现在字段中 当我按下按钮时,活动必须从Java Intent不从editText、android发送值,java,android,android-intent,Java,Android,Android Intent,我正在尝试使用intents将参数从一个活动(ActividadInsercionObjeto)传递到另一个活动(DatoSensor),但我一直在尝试不退出。我不确定我做错了什么 我需要传递的值是photo.jpg中最后一个名为idObjeto的值。这个值来自一个与远程MySql同步的SQLite,因此当原始活动打开时,这些值会出现在字段中 当我按下按钮时,活动必须从campoIdObjeto中获取值,这是“照片中的idObjeto”的值,然后它必须将该值发送给第二个活动并在祝酒词中显示。 当
campoIdObjeto
中获取值,这是“照片中的idObjeto”的值,然后它必须将该值发送给第二个活动并在祝酒词中显示。
当我执行应用程序时,它会停止并发送以下消息:
java.lang.NullPointerException:尝试调用虚拟方法
空值上的“android.os.Bundle android.content.Intent.getExtras()”
对象引用
照片:
我不知道为什么它不采取的价值
欢迎任何帮助。
谢谢
奥斯卡
活动来源:
public class ActividadInsercionObjeto extends AppCompatActivity
implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener {
// Referencias UI
private EditText campodescripcionNombre;
private EditText campoMarca;
private EditText campoModelo;
private EditText campoCorreo;
private EditText campoIdObjeto;
private Button accesodata;
public final static String EXTRA_ID = "idObjeto";
public EditText IdentidadObjeto;
// Clave del uri del objeto como extra
public static final String URI_OBJETO = "extra.uriObjeto";
private Uri uriObjeto;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad_insercion_objeto);
//agregarToolbar();
// Encontrar Referencias UI
campodescripcionNombre = (EditText) findViewById(R.id.campo_descripcion_nombre);
campoMarca = (EditText) findViewById(R.id.campo_marca);
campoModelo = (EditText) findViewById(R.id.campo_modelo);
campoCorreo = (EditText) findViewById(R.id.campo_correo);
campoIdObjeto = (EditText) findViewById(R.id.campo_idObjeto);
accesodata = (Button) findViewById(R.id.accesodata);
accesodata.setOnClickListener(this);
// Determinar si es detalle
String uri = getIntent().getStringExtra(URI_OBJETO);
if (uri != null) {
setTitle(R.string.titulo_actividad_editar_objeto);
uriObjeto = Uri.parse(uri);
getSupportLoaderManager().restartLoader(1, null, this);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_insercion_objeto, menu);
// Verificación de visibilidad acción eliminar
if (uriObjeto != null) {
menu.findItem(R.id.accion_eliminar).setVisible(true);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.accion_confirmar:
insertar();
break;
case R.id.accion_eliminar:
eliminar();
break;
}
return super.onOptionsItemSelected(item);
}
private void insertar() {
// Extraer datos de UI
String descripcionNombre = campodescripcionNombre.getText().toString();
String marca = campoMarca.getText().toString();
String modelo = campoModelo.getText().toString();
String correo = campoCorreo.getText().toString();
String IdentidadObjeto = campoIdObjeto.getText().toString();
// Validaciones y pruebas de cordura
if (!esNombreValido(descripcionNombre)) {
TextInputLayout mascaraCampoNombre = (TextInputLayout)findViewById(R.id.mascara_campo_nombre);
// esta linea la he añadido, si da fallo eliminar. Sujerida por corrector
assert mascaraCampoNombre != null;
// esta linea la he añadido, si da fallo eliminar. Sujerida por corrector fin
mascaraCampoNombre.setError("este campo no puede quedar vacio");
} else {
ContentValues valores = new ContentValues();
// Verificación: ¿Es necesario generar un id?
if (uriObjeto == null) {
valores.put(Objetos.ID_OBJETO, Objetos.generarIdObjeto());
}
valores.put(Objetos.DESCRIPCION_NOMBRE, descripcionNombre);
valores.put(Objetos.MARCA_MARCA, marca);
valores.put(Objetos.MODELO, modelo);
valores.put(Objetos.CORREO, correo);
valores.put(Objetos.VERSION, UTiempo.obtenerTiempo());
// Iniciar inserción|actualización
new TareaAnadirObjeto(getContentResolver(), valores).execute(uriObjeto);
finish();
}
}
private boolean esNombreValido(String nombre) {
return !TextUtils.isEmpty(nombre);
}
private void eliminar() {
if (uriObjeto != null) {
// Iniciar eliminación
new TareaEliminarObjeto(getContentResolver()).execute(uriObjeto);
finish();
}
}
private void poblarViews(Cursor data) {
if (!data.moveToNext()) {
return;
}
// Asignar valores a UI
campodescripcionNombre.setText(UConsultas.obtenerString(data, Objetos.DESCRIPCION_NOMBRE));
campoMarca.setText(UConsultas.obtenerString(data, Objetos.MARCA_MARCA));
campoModelo.setText(UConsultas.obtenerString(data, Objetos.MODELO));
campoCorreo.setText(UConsultas.obtenerString(data, Objetos.CORREO));
campoIdObjeto.setText(UConsultas.obtenerString(data, Objetos.ID_OBJETO));
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(this, uriObjeto, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
poblarViews(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
@Override
public void onClick(View v) {
if (v == accesodata) {
Intent i = new Intent(ActividadInsercionObjeto.this, DatosSensor.class);
i.putExtra("IdentidadEnviada", (Serializable) campoIdObjeto);
startActivity(i);
}
}
static class TareaAnadirObjeto extends AsyncTask<Uri, Void, Void> {
private final ContentResolver resolver;
private final ContentValues valores;
public TareaAnadirObjeto(ContentResolver resolver, ContentValues valores) {
this.resolver = resolver;
this.valores = valores;
}
@Override
protected Void doInBackground(Uri... args) {
Uri uri = args[0];
if (null != uri) {
Cursor c = resolver.query(uri, new String[]{Objetos.INSERTADO}, null, null, null);
if (c != null && c.moveToNext()) {
// Verificación de sincronización
if (UConsultas.obtenerInt(c, Objetos.INSERTADO) == 0) {
valores.put(Objetos.MODIFICADO, 1);
}
valores.put(Objetos.VERSION, UTiempo.obtenerTiempo());
resolver.update(uri, valores, null, null);
}
} else {
resolver.insert(Objetos.URI_CONTENIDO, valores);
}
return null;
}
}
static class TareaEliminarObjeto extends AsyncTask<Uri, Void, Void> {
private final ContentResolver resolver;
public TareaEliminarObjeto(ContentResolver resolver) {
this.resolver = resolver;
}
@Override
protected Void doInBackground(Uri... args) {
Cursor c = resolver.query(args[0], new String[]{Objetos.INSERTADO}
, null, null, null);
int insertado;
if (c != null && c.moveToNext()) {
insertado = UConsultas.obtenerInt(c, Objetos.INSERTADO);
} else {
return null;
}
if (insertado == 1) {
resolver.delete(args[0], null, null);
} else if (insertado == 0) {
ContentValues valores = new ContentValues();
valores.put(Objetos.ELIMINADO, 1);
resolver.update(args[0], valores, null, null);
}
return null;
}
}
}
public class DatosSensor extends AppCompatActivity {
private DrawerLayout drawerLayout;
String idObjeto = (String) getIntent().getExtras().getSerializable("IdentidadEnviada");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad_datos_sensor);
Toast.makeText(getApplicationContext(),idObjeto, Toast.LENGTH_LONG).show();
agregarToolbar();
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
if (navigationView != null) {
prepararDrawer(navigationView);
// Seleccionar item por defecto
seleccionarItem(navigationView.getMenu().getItem(0));
}
}
private void agregarToolbar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ActionBar ab = getSupportActionBar();
if (ab != null) {
// Poner ÃÂcono del drawer toggle
ab.setHomeAsUpIndicator(R.drawable.drawer_toggle);
ab.setDisplayHomeAsUpEnabled(true);
}
}
private void prepararDrawer(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(true);
seleccionarItem(menuItem);
drawerLayout.closeDrawers();
return true;
}
});
}
private void seleccionarItem(MenuItem itemDrawer) {
Fragment fragmentoGenerico = null;
FragmentManager fragmentManager = getSupportFragmentManager();
switch (itemDrawer.getItemId()) {
startActivity(new Intent(this, com.amg_eservices.appiot.SaltoWeb.WebOficial.class));
break;
//fragmentoGenerico = new BlankFragment();
case R.id.item_categorias:
startActivity(new Intent(this, com.amg_eservices.appiot.MisSensores.ui.ActividadListaObjeto.class));
break;
case R.id.item_acceso:
startActivity(new Intent(this, com.amg_eservices.appiot.RegistroyAcceso.MainActivity.class));
break;
}
if (fragmentoGenerico != null) {
fragmentManager
.beginTransaction()
.replace(R.id.contenido_principal, fragmentoGenerico)
.commit();
}
// Setear titulo actual
setTitle(itemDrawer.getTitle());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_actividad_principal, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
drawerLayout.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
}
您希望传递
campoIdObjeto
的值,而不是:
i.putExtra("IdentidadEnviada", (Serializable) campoIdObjeto);
写:
i.putExtra("IdentidadEnviada", (Serializable) campoIdObjeto.getText().toString());
EditText
不可序列化,因此无法传递它。但你可以传递它的价值
编辑
@Jordi Castilla答案的第二部分是在下一个活动中获得价值的关键。
不能在类的静态部分使用方法getIntent()
。您的代码:
String idObjeto = (String) getIntent().getExtras().getSerializable("IdentidadEnviada");
内部
DatosSensor
活动错误。应在活动生命周期的onCreate
方法内或以后调用。您传递了错误的值:
i.putExtra("IdentidadEnviada", (Serializable) campoIdObjeto); // this is a TextEdit!!!
一定是
i.putExtra("IdentidadEnviada", IdentidadObjeto); // this is the content of TextEdit
另外(我可能错了),但是如果在onCreate
事件之前调用intent,则会抛出NPE。因此,将这一行移到onCreate()
方法中
String idObjeto = (String) getIntent().getExtras().getStringExtra("IdentidadEnviada");
您正在传递“编辑文本”的引用而不是“编辑文本”的值,并将值强制转换为字符串,结果导致应用程序使用崩溃
intent.putExtra("IdentidadEnviada", campoIdObjeto.getText().toString());
campoIdObjetoi是文本对吗?xampoIdObjeto是字符串。此字符串是在“valores.put(Objetos.ID_OBJETO,Objetos.generarIdObjeto());”中形成的。OP已在以下位置获取此值(但未使用它):
string IdentidadObjeto=campoIdObjeto.getText().toString()代码>在不同的函数中检索该值。此外,在这段代码中有两个变量名为IdentidadObjeto
,一个类字段类型为TextView,另一个类型为onCreate(…)
方法中的String。因此,再次获取值更简单。无论如何,这不会解决NPE问题,因为意图检索不在正确的位置。。。这不是解决方案。关于intent receiver,您也是对的,我必须将它放在OnCreate中,但origin中的intent必须是“(可序列化的)campoIdObjeto.getText().toString());”。来自R,Zagórski的解决方案。这是因为您在变量没有值时分配了该变量,但如果您创建了identidabjeto
请正确使用或删除它。