Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Página 1
Sería bueno si el usuario pudiera agregar algunas notas personales al capítulo de que ella es
lectura, si eso sirve como comentario, puntos a investigar, quejas
sobre el cabello del autor (o la falta del mismo), o lo que sea.
Entonces, en este capítulo, agregaremos un nuevo fragmento y una nueva actividad para permitir al usuario
agregue notas por capítulo, a través de un gran widget EditText . Esas notas se almacenarán en un
Base de datos SQLite.
Puede encontrar los resultados del tutorial anterior y los resultados de este tutorial en el
repositorio GitHub del libro.
importar android.content.Context ;
https://translate.googleusercontent.com/translate_f 1/22
24/2/2020 Tutorial # 14 - Guardar notas
importar android.database.sqlite.SQLiteDatabase ;
707
Página 2
importar android.database.sqlite.SQLiteOpenHelper ;
retorno ( singleton );
}
@Anular
public void onCreate ( SQLiteDatabase db ) {
db . execSQL ( "CREAR TABLA notas (posición INTEGER PRIMARY KEY, prose TEXT);" );
}
@Anular
public void onUpgrade ( SQLiteDatabase db , int oldVersion ,
int newVersion ) {
lanzar nueva RuntimeException ( "Esto no debería llamarse" );
}
}
https://translate.googleusercontent.com/translate_f 2/22
24/2/2020 Tutorial # 14 - Guardar notas
708
Página 3
Como se señaló en el capítulo sobre bases de datos , es importante asegurarse de que todos los hilos estén
accediendo al mismo objeto SQLiteDatabase , para seguridad de subprocesos. Eso generalmente significa que tú
mantener un solo objeto SQLiteOpenHelper . Y, en nuestro caso, podríamos querer obtener
en esta base de datos de más de una actividad. Por lo tanto, vamos con el singleton
enfoque, para que todos trabajen con la misma instancia de DatabaseHelper .
importar android.app.Fragment ;
importar android.os.Bundle ;
importar android.view.LayoutInflater ;
importar android.view.View ;
importar android.view.ViewGroup ;
importar android.widget.EditText ;
https://translate.googleusercontent.com/translate_f 3/22
24/2/2020 Tutorial # 14 - Guardar notas
709
Página 4
volver ( frag );
}
@Anular
pública Vista onCreateView ( LayoutInflater de inflado ,
ViewGroup container ,
Paquete salvadoInstanceState ) {
Ver resultado = inflador . inflar ( R . diseño . editor , contenedor , falsa );
retorno ( resultado );
}
Tenga en cuenta que este fragmento utiliza el recurso res / layout / editor.xml que creamos
de vuelta en el Tutorial # 5 .
https://translate.googleusercontent.com/translate_f 4/22
24/2/2020 Tutorial # 14 - Guardar notas
710
Página 5
importar android.app.Activity ;
importar android.app.Fragment ;
importar android.os.Bundle ;
@Anular
public void onCreate ( Bundle savedInstanceState ) {
súper . onCreate ( savedInstanceState );
if ( posición > = 0) {
Fragmento f = Nota Fragmento . newInstance ( posición );
https://translate.googleusercontent.com/translate_f 5/22
24/2/2020 Tutorial # 14 - Guardar notas
711
Página 6
setContentView () iría:
es un contenedor suministrado por Activity en sí y sirve
como el contenedor más alto para nuestro contenido.
Sin embargo, esperamos que se nos pase un Intento adicional con el puesto
( EXTRA_POSITION ), que pasamos al método de fábrica NoteFragment .
Haga clic con el botón derecho sobre el directorio res / y elija Nuevo> Activo vectorial en el contexto
menú. Haga clic en el botón Icono y busque el icono "Crear":
Figura 290: Selector de iconos de Asset Studio, con Crear icono seleccionado
Haga clic en Aceptar para cerrar el selector de iconos. Luego haga clic en Siguiente y Finalizar para guardar este dibujo
recurso.
https://translate.googleusercontent.com/translate_f 6/22
24/2/2020 Tutorial # 14 - Guardar notas
712
Página 7
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / res / drawable / ic_create_white_24dp.xml )
A continuación, agregue un nuevo recurso de cadena, denominado notes , con un valor como Notes .
<artículo
android: id = "@ + id / notes"
android: icon = "@ drawable / ic_create_white_24dp"
android: showAsAction = "ifRoom | withText"
android: title = "@ string / notes" >
</item>
<artículo
android: id = "@ + id / settings"
android: icon = "@ drawable / ic_settings_black_24dp"
android: showAsAction = "nunca"
android: title = "@ string / settings" >
</item>
<artículo
android: id = "@ + id / help"
android: icon = "@ drawable / ic_help_outline_black_24dp"
android: title = "@ string / help" >
</item>
<artículo
android: id = "@ + id / about"
android: icon = "@ drawable / ic_info_outline_black_24dp"
android: title = "@ string / about" >
</item>
</menu>
https://translate.googleusercontent.com/translate_f 7/22
24/2/2020 Tutorial # 14 - Guardar notas
713
Página 8
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / res / menu / options.xml )
caso R . id . notas :
startActivity ( nueva intención ( esto , NoteActivity . class )
. putExtra ( NoteActivity . EXTRA_POSITION ,
buscapersonas . getCurrentItem ()));
retorno ( verdadero );
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / EmPubLiteActivity.java )
clase NoteLoadedEvent
NoteLoadedEvent {
posición int ;
Prosa de cuerdas ;
int getPosition () {
retorno ( posición );
}
https://translate.googleusercontent.com/translate_f 8/22
24/2/2020 Tutorial # 14 - Guardar notas
714
Página 9
String getProse () {
retorno ( prosa );
}
}
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteLoadedEvent.java )
Si lo prefiere, puede ver el contenido de este archivo en su navegador web a través de este GitHub
enlace.
Edite su DatabaseHelper para agregar su propia clase interna LoadThread , que recuerda a la
uno de ModelFragment :
@Anular
public void run () {
Proceso . setThreadPriority ( Proceso . THREAD_PRIORITY_BACKGROUND );
if ( c . getCount ()> 0) {
c . moveToFirst ();
c . cerrar ();
}
}
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / DatabaseHelper.java )
https://translate.googleusercontent.com/translate_f 9/22
24/2/2020 Tutorial # 14 - Guardar notas
715
Página 10
Aquí, usamos rawQuery () para recuperar la nota basada en una posición provista. Si
no hay tal nota, nuestro Cursor no tendrá filas, y hemos terminado. Si, sin embargo, nosotros
obtuvimos resultados en la consulta, luego publicamos un NoteLoadedEvent con el
posición y la prosa (el texto de la base de datos).
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / DatabaseHelper.java )
@Anular
public void onStart () {
súper . onStart ();
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteFragment.java )
Aquí, nos registramos para el EventBus . Entonces, si no tenemos ningún texto en EditText
widget, llamamos loadNote () en nuestra instancia singleton de DatabaseHelper , pasando
en la posición que gestiona nuestro fragmento. La razón para verificar si el
EditText está vacío es para manejar los cambios de configuración. Este fragmento no es un
fragmento retenido, por lo que será destruido y recreado. El valor por defecto
https://translate.googleusercontent.com/translate_f 10/22
24/2/2020 Tutorial # 14 - Guardar notas
716
Página 11
@Anular
public void onStop () {
EventBus . getDefault (). anular el registro ( esto );
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteFragment.java )
Aquí, confirmamos que el evento es para la posición de nuestro fragmento, ya que es concebible
que este evento es para alguna otra nota, aunque eso es bastante improbable dada la forma en que
El usuario vería las notas. Dicho esto, si la nota es para nuestra posición, poblamos
la EditarTexto con la prosa nota.
717
https://translate.googleusercontent.com/translate_f 11/22
24/2/2020 Tutorial # 14 - Guardar notas
Pagina 12
@Anular
public void run () {
Proceso . setThreadPriority ( Proceso . THREAD_PRIORITY_BACKGROUND );
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / DatabaseHelper.java )
Aquí, usamos execSQL () para ejecutar una instrucción SQL INSERT O REPLACE . Como el
el nombre sugiere, esto insertará una nueva fila si no hay coincidencia en nuestra clave primaria
( posición ) De lo contrario, actualizará las otras columnas si hay una coincidencia.
Tenga en cuenta que no publicamos un evento aquí. Podríamos, si hubiera algo en la aplicación
eso necesitaba saber cuándo se actualizó una nota.
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / DatabaseHelper.java )
718
https://translate.googleusercontent.com/translate_f 12/22
24/2/2020 Tutorial # 14 - Guardar notas
Página 13
información parcialmente ingresada, puede guardarla en un área "lateral", como una temporal
archivo, y tratarlo cuando el usuario regrese a su aplicación. O simplemente podrías actualizar
el verdadero almacén de datos ... que es lo que haremos aquí.
@Anular
public void onStop () {
DatabaseHelper . getInstance ( getActivity ())
. updateNote ( getPosition (),
editor . getText (). toString ());
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteFragment.java )
Aquí, actualizamos la nota. Esto es un poco ineficiente, ya que actualizamos la base de datos incluso si
el usuario no cambió el texto de la nota, ni siquiera si la nota está vacía. Ese
representa otra optimización que una aplicación de grado de producción podría desear seguir
pero se omite aquí en aras de la simplicidad.
719
https://translate.googleusercontent.com/translate_f 13/22
24/2/2020 Tutorial # 14 - Guardar notas
Página 14
Al tocar eso, aparecerán las notas para cualquier posición de ViewPager en la que se encuentre
en. Ingresando algunas notas y presionando ATRÁS para salir de la actividad guardará esas
notas, que volverá a ver si vuelve a tocar el botón de la barra de herramientas de la barra de acciones. Si tu
cambiar las notas, presionando ATRÁS guardará las notas cambiadas en la base de datos, para ser
visto de nuevo más tarde cuando vuelva a las notas para esa posición ViewPager .
Haga clic con el botón derecho sobre el directorio res / y elija Nuevo> Activo vectorial en el contexto
menú. Haga clic en el botón Icono y busque el icono "eliminar":
720
https://translate.googleusercontent.com/translate_f 14/22
24/2/2020 Tutorial # 14 - Guardar notas
Página 15
Figura 292: Selector de iconos de Asset Studio, con el icono Eliminar seleccionado
Haga clic en Aceptar para cerrar el selector de iconos. Cambie el nombre del recurso a
ic_delete_white_24dp . Luego haga clic en Siguiente y Finalizar para guardar este recurso dibujable.
Luego, abra res / drawable / ic_delete_white_24dp.xml y cambie el
android: fillColor en el elemento <path> para ser #FFFFFFFF en lugar de # FF000000 :
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / res / drawable / ic_delete_white_24dp.xml )
A continuación, agregue un nuevo recurso de cadena, denominado eliminar , con un valor como Eliminar .
Luego, cree un nuevo recurso, res / menu / notes.xml , para configurar la barra de acción para
La actividad que aloja nuestro NoteFragment :
721
https://translate.googleusercontent.com/translate_f 15/22
24/2/2020 Tutorial # 14 - Guardar notas
Página 16
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / res / menu / notes.xml )
Esto simplemente define un único elemento de barra de acción, con una ID de eliminación .
Para hacer esto, los usuarios de Android Studio pueden hacer clic derecho sobre el directorio res / menu / y
elija Nuevo> "Archivo de recursos del menú" en el menú contextual. Complete notes.xml en el
Cuadro de diálogo "Nuevo archivo de recursos de menú" y haga clic en Aceptar. Pegue el XML que se muestra arriba en
ese archivo
Si lo prefiere, puede ver el contenido de este archivo en su navegador web a través de este GitHub
enlace.
Para que Android sepa que nuestro NoteFragment desea participar en la barra de acción,
Necesitamos llamar a setHasOptionsMenu (verdadero) en algún momento. Agregar un onCreate ()
Método para NoteFragment para manejar esto cuando se crea el fragmento:
@Anular
public void onCreate ( Bundle savedInstanceState ) {
súper . onCreate ( savedInstanceState );
setHasOptionsMenu ( verdadero );
}
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteFragment.java )
@Anular
public void onCreateOptionsMenu ( Menú de menú , menú Inflador de menú ) {
inflado . inflar ( R . menú . notas , de menú );
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteFragment.java )
Esto simplemente infla nuestro nuevo recurso para usar en el menú de opciones.
722
https://translate.googleusercontent.com/translate_f 16/22
24/2/2020 Tutorial # 14 - Guardar notas
Página 17
@Anular
public boolean onOptionsItemSelected ( elemento MenuItem ) {
si ( elemento . GetItemID () == R . ID . borrar ) {
editor . setText ( nulo );
retorno ( verdadero );
}
Aquí, si el usuario tocó nuestro elemento de la barra de acciones de eliminación , borramos el Texto de edición
widget
Podríamos usar otro objeto de evento y nuestro EventBus . En este caso, lo haremos
demostrar otro enfoque: usar el patrón de contrato para alertar al hosting
actividad que las notas deben estar cerradas.
interfaz publica
contrato de interfaz {
nulo closeNotes ();
}
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteFragment.java )
Puede poner esas líneas inmediatamente después de la clase pública NoteFragment ...
línea, antes de la declaración de cualquiera de los miembros de datos o métodos, por ejemplo.
723
https://translate.googleusercontent.com/translate_f 17/22
24/2/2020 Tutorial # 14 - Guardar notas
Página 18
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteFragment.java )
Lo que estamos haciendo aquí es hacer cumplir que la actividad que aloja nuestro NoteFragment
debe implementar la interfaz NoteFragment.Contract .
@Anular
public boolean onOptionsItemSelected ( elemento MenuItem ) {
si ( elemento . GetItemID () == R . ID . borrar ) {
editor . setText ( nulo );
getContract (). closeNotes ();
retorno ( verdadero );
}
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteFragment.java )
Ahora, cuando el usuario hace clic en el elemento de la barra de acción Eliminar , borramos el Texto de edición y
Solicite la actividad de alojamiento para deshacerse de nosotros. En el camino, se llamará a nuestro onStop () ,
haciendo que también borremos el contenido de la columna de prosa en nuestra fila de la base de datos.
importar android.app.Fragment ;
importar android.os.Bundle ;
importar android.text.TextUtils ;
importar android.view.LayoutInflater ;
importar android.view.Menu ;
importar android.view.MenuInflater ;
importar android.view.MenuItem ;
importar android.view.View ;
importar android.view.ViewGroup ;
importar android.widget.EditText ;
import org.greenrobot.eventbus.EventBus ;
import org.greenrobot.eventbus.Subscribe ;
724
https://translate.googleusercontent.com/translate_f 18/22
24/2/2020 Tutorial # 14 - Guardar notas
Página 19
import org.greenrobot.eventbus.ThreadMode ;
volver ( frag );
}
@Anular
public void onCreate ( Bundle savedInstanceState ) {
súper . onCreate ( savedInstanceState );
setHasOptionsMenu ( verdadero );
}
@Anular
pública Vista onCreateView ( LayoutInflater de inflado ,
ViewGroup container ,
Paquete salvadoInstanceState ) {
Ver resultado = inflador . inflar ( R . diseño . editor , contenedor , falsa );
retorno ( resultado );
}
@Anular
public void onStart () {
súper . onStart ();
725
https://translate.googleusercontent.com/translate_f 19/22
24/2/2020 Tutorial # 14 - Guardar notas
Página 20
@Anular
public void onStop () {
DatabaseHelper . getInstance ( getActivity ())
. updateNote ( getPosition (),
editor . getText (). toString ());
@Anular
public void onCreateOptionsMenu ( Menú de menú , menú Inflador de menú ) {
inflado . inflar ( R . menú . notas , de menú );
@Anular
public boolean onOptionsItemSelected ( elemento MenuItem ) {
si ( elemento . GetItemID () == R . ID . borrar ) {
editor . setText ( nulo );
getContract (). closeNotes ();
retorno ( verdadero );
}
726
https://translate.googleusercontent.com/translate_f 20/22
24/2/2020 Tutorial # 14 - Guardar notas
Página 21
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteFragment.java )
importar android.app.Activity ;
importar android.app.Fragment ;
importar android.os.Bundle ;
@Anular
public void onCreate ( Bundle savedInstanceState ) {
súper . onCreate ( savedInstanceState );
if ( posición > = 0) {
Fragmento f = Nota Fragmento . newInstance ( posición );
@Anular
public void closeNotes () {
terminar ();
}
}
(de EmPubLite-AndroidStudio / T14-Database / EmPubLite / app / src / main / java / com / commonsware / empublite / NoteActivity.java )
727
https://translate.googleusercontent.com/translate_f 21/22
24/2/2020 Tutorial # 14 - Guardar notas
Página 22
Al tocar ese botón de la barra de herramientas se borrará la nota y se cerrará la actividad, devolviéndote
al libro
728
https://translate.googleusercontent.com/translate_f 22/22