Java Intent不从editText、android发送值

Java Intent不从editText、android发送值,java,android,android-intent,Java,Android,Android Intent,我正在尝试使用intents将参数从一个活动(ActividadInsercionObjeto)传递到另一个活动(DatoSensor),但我一直在尝试不退出。我不确定我做错了什么 我需要传递的值是photo.jpg中最后一个名为idObjeto的值。这个值来自一个与远程MySql同步的SQLite,因此当原始活动打开时,这些值会出现在字段中 当我按下按钮时,活动必须从campoIdObjeto中获取值,这是“照片中的idObjeto”的值,然后它必须将该值发送给第二个活动并在祝酒词中显示。 当

我正在尝试使用intents将参数从一个活动(ActividadInsercionObjeto)传递到另一个活动(DatoSensor),但我一直在尝试不退出。我不确定我做错了什么

我需要传递的值是photo.jpg中最后一个名为idObjeto的值。这个值来自一个与远程MySql同步的SQLite,因此当原始活动打开时,这些值会出现在字段中

当我按下按钮时,活动必须从
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
请正确使用或删除它。