2016-07-05 4 views
-1

Я пытаюсь передать параметр от одного вида деятельности (ActividadInsercionObjeto) к другой (DatosSensor) с помощью намерения, но я пытался с не выходом. Я не уверен, что я делаю неправильно.Намерение не отправляет значения из EditText, андроид

Значение, которое мне нужно передать, - это последнее значение, называемое idObjeto на фото.jpg. Это значение исходит из SQLite, который был синхронизирован с удаленным MySql, поэтому, когда активность начала открыта, значения попадают внутрь полей.

Когда я нажимаю кнопку, то активности придется принимать значение от campoIdObjeto, который является значением «idObjeto на фото», а затем он должен отправить это значение sencond деятельности и показать его в тост. Когда я исполняю приложение, он останавливается и отправить это сообщение:

java.lang.NullPointerException: Попытка вызвать виртуальный метод

«android.os.Bundle android.content.Intent.getExtras() 'на нулевой ссылке .

Фото: photoscreen Я не знаю, почему он не принимает значение ...

Любая помощь будет приветствоваться. Благодаря Oscar

активность происхождения:

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

} 

Destiny активность:

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


} 
+0

campoIdObjetoi является текст правой ? –

+0

xampoIdObjeto - это строка. Эта строка была сформирована в "valores.put (Objetos.ID_OBJETO, Objetos.generarIdObjeto());". –

ответ

-1

Вы хотите передать значение campoIdObjeto, поэтому вместо того, чтобы:

i.putExtra("IdentidadEnviada", (Serializable) campoIdObjeto); 

пишут:

i.putExtra("IdentidadEnviada", (Serializable) campoIdObjeto.getText().toString()); 

EditText не serialisable, так что вы не можете передать его. Но вы можете передать его значение.

EDIT Вторая часть ответа @Jordi Castilla - это ключ к получению значения в следующем действии. Вы не можете использовать метод getIntent() в статической части класса. Ваш код:

String idObjeto = (String) getIntent().getExtras().getSerializable("IdentidadEnviada"); 

DatosSensor Активность не правильная. Должен быть вызван внутри метода onCreate или позже в жизненном цикле активности.

+0

OP уже принимает это значение (но не использует его) в: 'String IdentidadObjeto = campoIdObjeto.getText(). ToString();' –

+0

Значение извлекается в другой функции. Кроме того, в этом коде есть две переменные, называемые «IdentidadObjeto», одно поле класса типа TextView и один из типов String внутри 'onCreate (...)'. Поэтому проще получить значение еще раз. –

+0

в любом случае, это не решит «NPE», потому что поиск цели не в нужном месте ... это не решение. –

1

Вы передаете неправильное значение:

i.putExtra("IdentidadEnviada", (Serializable) campoIdObjeto); // this is a TextEdit!!! 

должен быть

i.putExtra("IdentidadEnviada", IdentidadObjeto); // this is the content of TextEdit 

Кроме того (я могу ошибаться), но если вы звоните намерение ДО onCreate событие отбросит NPE. Таким образом, переместить эту линию внутри onCreate() метода

String idObjeto = (String) getIntent().getExtras().getStringExtra("IdentidadEnviada"); 
+0

Также вы правы относительно приемника намерений, я должен был поместить его в OnCreate, но намерение в начале должно быть «(Serializable) campoIdObjeto.getText(). ToString());». Решение от R, Zagórski. –

+0

@OscarC. это связано с тем, что вы назначаете переменную, когда она не имеет значения, но если вы создаете 'IdentidadObjeto' **, используйте ее правильно или удалите ее **. –

+0

Сделай это. Благодарю. Сейчас он работает безрезультатно. –

0

Вы передаете Ссылка на редактирование текста не значение EditText и разливочных значение строки с результатами сбой приложения используют

intent.putExtra("IdentidadEnviada", campoIdObjeto.getText().toString()); 
Смежные вопросы