Spanish [SOLUCIONADO]Es posible mostrar un msgbox una sola vez despues de instalar la app de B4a?

chuy-mjr

Member
Buenas, quiero mostrar un msgbox la primer vez que alguien instala la app, algo asi como aceptar los terminos de licencia, pero que despues no vuelva a salir. Es posible eso?

Segunda pregunta. Si muestro un msgbox2 con dos opciones Si y cancel, puedo forzar que elija una? Esque si toco en otro lado del celular se cierra el mensaje y continuo con la app.

Gracias.
 

José J. Aguilar

Well-Known Member
Licensed User
Hola:

Puedes usar una variable para saber si ya has mostrado el mensaje y guardarla por ejemplo en KVS.
De esa manera la consultas siempre al iniciar el programa, y si es TRUE, es que ya has mostrado el mensaje.

Por otro lado, no se recomienda usar msgbox

En su lugar se recomienda usar MsgBox2Async que tiene un parametro “cancelable”, el cual permite que se pueda cancelar o no

 

chuy-mjr

Member
Hola gracias por responder.

He hecho algo similar que al entrar por primera ves muestre un mensaje de seleccion con msgbox2 y que si va a otro lado de la app al regresar al main no pregunte otra vez, el punto que no se guardar nada fuera del programa para poder hacer lo mismo ni se que es kvs, apenas estoy empezando soy muy novato

Cual es la diferencia entre el msgbox2 con el msgboxAsync? Veo un true despues del null que es para la imagen pero aun no se cual es su uso. Cuando este en el pc traducire a ver que es

Que me recomiendas leer para guardar una variable fuera del programa y hacer la sentencia if y que no vuelva a preguntar?

Gracias de nuevo.
 

José J. Aguilar

Well-Known Member
Licensed User
Hola:

Échale un ojo al tutorial de KVS (KeyValueStore). No es más que una pequeña base de datos sqlite en la que puedes guardar datos en la forma "clave->valor" (por ejemplo: "MensajeMostrado->True"

Al abrir tu programa por primera vez, lees la variable MensajeMostrado, si es false o no existe (la primera vez no existirá) pues muestras tu mensaje y grabas MensajeMostrado->True. Y ya no se volverá a mostrar más.

Solo tienes que marcar en tu lista de librerías KeyValueStore2 para usarla.

La diferencia entre msgbox y msgboxAsync, como indica en el enlace que te puse, es que la primera bloquea la ejecución. Es decir, cuando se muestra, todo lo demás se para, por lo que no es recomendable usarla.

El null indica que no habrá imagen, y Cancelable, si pones True quiere decir que podrá cancelarse (pulsando la tecla atrás u otro lugar de la pantalla) y False indica que no podrá cancerlarse, que es lo que tú quieres.

Msgbox2Async (Message As CharSequence, Title As CharSequence, Positive As String, Cancel As String, Negative As String, Icon As Bitmap, Cancelable As Boolean) As Object

Cancelable - If true then the dialog can be canceled by clicking on the back key or outside the dialog.
The object returned can be used as the Sender Filter parameter of Wait For.
Example:
B4X:
Msgbox2Async("Acepta las condiciones?", "Terminos Licencia", "Sí", "", "No", Null, False)
Wait For Msgbox_Result (Result As Int)
If Result = DialogResponse.POSITIVE Then
'...
End If
 

chuy-mjr

Member
Muchas gracias solo le agregue Async y el false y funciona de maravilla, esta linea no la ocupe y no se para que sive:
Wait For Msgbox_Result (Result As Int)

pero con solo lo otro me funcionó, ahora a leer el otro artículo para ver si puedo hacer que solo lo muestre una única vez, como un acuerdo de licencia que usa la app bajo su propia responsabilidad, estaré postiando a ver si pude.

gracias de nuevo
 

chuy-mjr

Member
Estube viendo el hilo pero vaya que complicado jeje jamás habia instalado una libreria, y pues descargo lo del link, y me descarga archivos .bal o un proyecto de ejemplo, pero vi otro tema como instalar librerias y me voy a librerias pero todos los archivos dicen al final .xml y .jar y no tengo ningún archivo que diga eso del post de erel,

Mis disculpas por ser tan lento para entender.
 

chuy-mjr

Member
Bueno daré por solucionado el problema ya que me postearon los enlaces para ello aunque al final en lo personal no logre hacerlo pero la solución está ahí para quien vea el hilo, gracias.
 

José J. Aguilar

Well-Known Member
Licensed User
Hola chuy-mjr:

Nos gusta ayudar a que la gente resuelva sus problemas y consiga los objetivos, no queremos que nadie se rinda, pero también nos gusta ver algo de implicación y de estudio. Si tienes una duda y te enviamos la solución, se deja de aprender mucho por el camino.

Wait For Msgbox_Result (Result As Int)
Esa línea lo que hace es que cuando se muestre el msgbox, se espere por el resultado. El resultado lo devuelve el Msgbox_result como un entero (Result as int) y ese entero representa cada una de las respuestas ("Aceptar", "Cancelar", ....)

y me descarga archivos .bal o un proyecto de ejemplo
¿Realmente te has descargado y ejecutado el ejemplo de KVS2? No hace falta descargar ninguna librería ya que como indica al final del hilo, desde la versión 8 de B4A KVS2 es una librería interna, por lo que sólo tienes que seleccionarla en la pestaña lateral. Es más, cuando abres el ejemplo ni siquiera tendrás que marcarla ya que las librerías que ya existen se marcan solas. ¿Qué versión de B4A tienes?
1586931563063.png


Las librerías que se instalan, son las que hace otra gente del foro o el mismo Erel pero no son librerías internas del IDE. Esas suelen venir como dos ficheros (.xml y .jar) o últimamente como b4xlib y hay que copiarlas en un directorio, y configurarlas en el IDE, pero esto no te hace falta ahora mismo.

Mis disculpas por ser tan lento para entender.
Nada que disculpar, mientras lo intentes y plantees dudas, aquí estaremos. Si no lo intentas, nosotros tampoco intentaremos ayudarte ;-)

Ahora bien, en tu app, marcas la librería KeyValueStore2 como está marcado arriba. Como verás en el ejemplo, añades estas líneas en el servicio starter
B4X:
Sub Process_Globals
    Public kvs As KeyValueStore 'Declaras la base de datos sqlite para usarla
End Sub

Sub Service_Create
    kvs.Initialize(File.DirInternal, "datastore2") 'La inicializas y haces que se grabe en File.Dirinternal, con el nombre datastore2, que puedes cambiar
End Sub
[EDITO] Se me había pasado indicar dónde va esta parte del código
Y esta parte la pondrías al inicio de Main

B4X:
    If (Starter.kvs.ContainsKey("MensajeMostrado") = False) Then 'Si kvs no contiene una clave llamada "MensajeMostrado"
        'Muestras tu mensaje y si lo acepta
        Starter.kvs.Put("MensajeMostrado", True) 'Se guarda como true, por tanto el if ya no será false nunca más
    End If
 
Last edited:

chuy-mjr

Member
Saludos

Antes que todo muchas gracias, entiendo el mensaje de esforzarse.

Ahí radica el problema creo que tengo la versión menor a 8, motivo? Pues nose porque pero he tenido una gran traba para instalar el programa descargaba de un lugar de otro y me daba errores, incluso desde la pagina de aqui, no entiendo el porque hasta que lo pude instalar desde un tutorial de youtube, y pues voy en teoria avanzado con la mini app y pues me da miedo actualizar y que me deje de funcionar todo lo que hasta ahora he hecho o ciertas partes y tenga que empezar el proyector de cero si no es compatible nose, creo que dejare este apartado de la licencia al final en caso de que me de error ya tenga el programa listo, porque no me sale esa libreria.

Muchas gracias por todo y tratare de indagar mas antes de postear, hasta que haya agotado toda posibilidad. (Y)
 

chuy-mjr

Member
Saludos.

De antemano muchas gracias porque he podido lograr que se muestre una sola ves despues de instalar la app, primero pregunta el idioma español o ingles y dependiendo el idioma muestra los terminos de licencia en español o en ingles y si no los acepta se cierra y si entra otra ves vuelvo a mostrarlos, si los acepta pues no vuelve a preguntar ni el idioma ni los terminos de licencia, pero tengo un problema.

Si selecciono ingles y acepto los terminos, al cerrar la app y volverla abrir no me muestra los mensajes, pero el menu me aparece en español, y es que despues de todo ese proceso tengo una sentencia:

B4X:
If IdiomaGlobalVariable = "Español" Then
        'Cambiar texto a español
        Button1.Text =  Chr(0xF1E6) & " - Eléctrico"
        Button2.Text =  Chr(0xF043) & " - Fontanería"
        Button3.Text = Chr(0xF0AD) & " - Herramientas"
        Spinner1.SelectedIndex = 0
        'finaliza el cambiar texto al español
          
    else if IdiomaGlobalVariable = "English" Then
        'Cambiar texto a ingles
        Button1.Text = Chr(0xF1E6) & " - Electric"
        Button2.Text = Chr(0xF043) & " - Plumbing"
        Button3.Text = Chr(0xF0AD) & " - Tools"
        'finaliza el cambiar texto al ingles
        Spinner1.SelectedIndex = 1
    End If
Hay alguna forma que guarde en otra variable el idioma, para antes de poner la sentencia if yo igual la variable IdiomaGlobalVariable = español o ingles dependiendo como se guardo?

Realmente aun no entiendo la creacion de estos valores, pero esta linea que hace?

B4X:
Starter.kvs.Put("LicenciaAceptada", True)
Crea un valor licenciaaceptada? podria poner otra linea que cree otro valor por ejemplo

B4X:
Starter.kvs.Put("IdiomaIngles", True)
Y despues si acepta los terminos en español otra linea asi?

B4X:
Starter.kvs.Put("IdiomaEspañol", True)
y luego antes de la sentencia de cambiar el idioma igual la variable asi?


B4X:
If (Starter.kvs.ContainsKey("IdiomaEspañol") = true) Then
        IdiomaGloblaVariable = "Español"
        Starter.kvs.Put("IdiomaEnglish", False)
        end if
      
        If (Starter.kvs.ContainsKey("IdiomaEnglish") = true) Then
        IdiomaGloblaVariable = "English"
        Starter.kvs.Put("IdiomaEspañol", False)
        end if
Es una idea realmente no se como funciona, pero si hay otra idea que funcione para poder hacer que la variable IdiomaGlobalVariable igualarla a ingles o español dependiendo el idioma seleccionado, realmente tengo que entender las kvs, si me podrian orientar lo agradeceria.
 

chuy-mjr

Member
Lo he logrado, pero tengo otra pregunta, si acepto los terminos no vuelve a salir, pero vuelvo a borrar la app de mi celular y la ejecuto de nuevo pero al instalarla no me sale, la cierra y la vuelvo a abrir y si me sale, es raro porque si cierro el b4a, borro la app, abro el b4a y ejecuto entonces si me salen los terminos de licencia, sera que queda en cache o algo asi? pero de todas formas creo que funciona perfecto mas que todo pasa eso al estarla testeando. aqui pongo el codigo con el cual lo logre para ver si me puede ayudar si es correcto o no, aunque me funciona.

Pues en la sentencia if si no existe el valor de ("Licenciaaceptada", true) y si la aceptan, si es en idioma español pongo esto: Starter.kvs.Put("IdiomaEspañol", True) y si es en idioma ingles que la aceptan pongo esto Starter.kvs.Put("IdiomaEnglish", True)

Despues cuando ya va a cargar lo demas pongo esto

B4X:
If (Starter.kvs.ContainsKey("IdiomaEspañol") = True) Then
        IdiomaGlobalVariable="Español"
    End If
    If (Starter.kvs.ContainsKey("IdiomaEnglish") = True) Then
        IdiomaGlobalVariable="English"
    End If
Con eso logro pues que me cargue lla variable idiomaglobalvariable dependiendo lo que selecciono al aceptar el acuerdo de licencia, para que no esten seleccionando el idioma cada ves que abren la app, ya que puse el mensaje de seleccionar el idioma junto con el de aceptar la licencia.

y como tengo un spinner para seleccionar idioma en caso que quieran cambiar idioma por cualquier razon, tenia problema, pero pude usar estas lineas para corregirlo:
Si da click en el spiner español
Starter.kvs.Put("IdiomaEspañol", True)
Starter.kvs.Remove("IdiomaEnglish")
si da click en el spiner ingles
Starter.kvs.Put("IdiomaEnglish", True)
Starter.kvs.Remove("IdiomaEspañol")

con eso creo el idioma que quiero y borro el otro que ya no deseo. No pense lograr esta parte yo solo pero provando y provando lo logre, y la verdad me motiva a seguir con la app que la deje unos 15 dìas abandonada

B4X:
Select Spinner1.SelectedIndex
        Case 0
            IdiomaGlobalVariable = "Español"
            'Cambiar texto a español
            Button1.Text =  Chr(0xF1E6) & " - Eléctrico"
            Button2.Text =  Chr(0xF043) & " - Fontanería"
            Button3.Text = Chr(0xF0AD) & " - Herramientas"
            ToastMessageShow ("Se ha cambiado el idioma al Español" , True)
            'finaliza el cambiar texto al español
            Starter.kvs.Put("IdiomaEspañol", True)
            Starter.kvs.Remove("IdiomaEnglish")
            
        Case 1
            
            IdiomaGlobalVariable = "English"
             'Cambiar texto a ingles
            Button1.Text = Chr(0xF1E6) & " - Electric"
            Button2.Text = Chr(0xF043) & " - Plumbing"
            Button3.Text = Chr(0xF0AD) & " - Tools"
            ToastMessageShow ("Language has been changed to English" , True)
            'finaliza el cambiar texto al ingles
            
            Starter.kvs.Put("IdiomaEnglish", True)
            Starter.kvs.Remove("IdiomaEspañol")
    End Select
En serio muchas gracias, descargue la version mas actual, no lo hacia por miedo que no fuera compatible pero todo de maravilla, en serio muchas gracias por el tiempo que se toman en ayudar =)
 

José J. Aguilar

Well-Known Member
Licensed User
Hola chuy-mjr, me alegro de que vayas solucionando los problemas y sobre todo que estés motivado para seguir con ella e ir superando los problemas.

Realmente aun no entiendo la creacion de estos valores, pero esta linea que hace?

B4X:
Starter.kvs.Put("LicenciaAceptada", True)
Puedes echar un ojo a este post


Creo que sería más fácil si hicieras:
B4X:
Starter.kvs.Put("Idioma", "Español")

o

Starter.kvs.Put("Idioma", "English")
De esta forma tendrías en tu variable Idioma el idioma seleccionado.

saludos,
 

chuy-mjr

Member
Hola chuy-mjr, me alegro de que vayas solucionando los problemas y sobre todo que estés motivado para seguir con ella e ir superando los problemas.


Puedes echar un ojo a este post


Creo que sería más fácil si hicieras:
B4X:
Starter.kvs.Put("Idioma", "Español")

o

Starter.kvs.Put("Idioma", "English")
De esta forma tendrías en tu variable Idioma el idioma seleccionado.

saludos,
Muchas gracias por todo, pero para salir de dudas, de la forma que lo hize, es mas complicado pero, no daría problema en algún momento el usarlo asi? ese es mi miedo.

Otra opcion podria ser detectar el idioma en el que esta configurado el dispositivo y si no es el español mostrar la informacion en ingles.
Eso suena interesante pero mas complejo me imagino.
 

chuy-mjr

Member
Jose aguilar, una consulta mas, y como hago una sentencia If para determinar si el idioma es Español o Ingles? ya que intento mas o menos de la misma forma como me mostraste.

Lo intento así tratando de usar dos valores para la idioma


B4X:
If (Starter.kvs.ContainsKey("Idioma") = False) Then
        Starter.kvs.Put("Idioma", True)
        Starter.kvs.Put("Idioma" , "Español")
    End If
Luego para la condicion if verificando si el valor del idioma es español no me funciona

B4X:
If (Starter.kvs.ContainsKey("Idioma" , "Español") = True) Then
       
    End If
La primera parte creo me funciona pero la sentencia if me da error y dice demasiados parametros, espero me puedan orientar un poco, gracias de antemano
 

José J. Aguilar

Well-Known Member
Licensed User
Hola:

No has entendido bien el concepto. Containskey quiere decir “si contiene la clave”. Es decir, preguntas si ya has añadido a kvs una clave llamada idioma. Si no lo has hecho, quiere decir que no existe.

Por tanto, debería ser
B4X:
If (Starter.kvs.ContainsKey("Idioma") = False) Then
        Starter.kvs.Put("Idioma" , "Español")
        ’muestras el msgbox
End If
depues de esto, containskey sera TRUE porque kvs ya “contiene una clave idioma” (cuyo valor es “español” o ingles)

bastaria hacer
B4X:
If Starter.kvs.ContainsKey("Idioma") Then
       'aqui ya sabes que el idioma esta definido a español o ingles, porque habra entrado si es true
    End If
para obtener el valor de unaclave, se usa get.
B4X:
if kvs.get("idioma") = "español" then
  'idioma español
else
  'ingles
emd if
 
Last edited:

chuy-mjr

Member
Hola:

No has entendido bien el concepto. Containskey quiere decir “si contiene la clave”. Es decir, preguntas si ya has añadido a kvs una clave llamada idioma. Si no lo has hecho, quiere decir que no existe.

Por tanto, debería ser
B4X:
If (Starter.kvs.ContainsKey("Idioma") = False) Then
        Starter.kvs.Put("Idioma" , "Español")
        ’muestras el msgbox
End If
depues de esto, containskey sera TRUE porque kvs ya “contiene una clave idioma” (cuyo valor es “español” o ingles)

bastaria hacer
B4X:
If Starter.kvs.ContainsKey("Idioma") Then
       'aqui ya sabes que el idioma esta definido a español o ingles, porque habra entrado si es true
    End If
para obtener el valor de unaclave, se usa get.
B4X:
if kvs.get("idioma") = "español" then
  'idioma español
else
  'ingles
emd if
Muchas Gracias en serio muchas muchas gracias.

No tanto:
B4X:
Sub defaultLanguage As String
    Dim r As Reflector
    r.Target = r.RunStaticMethod("java.util.Locale", "getDefault", Null, Null)
    Return r.RunMethod("getLanguage")
End Sub
Muchas gracias voy a ver si puedo aplicarlo tambien para ir aprendiendo mas.

Una duda mas: Cuantos valores kvs se pueden agregar? Asi de este estilo "Idioma" , "Español"

Y se hace mas pesado o consume espacio significativo?
 

José J. Aguilar

Well-Known Member
Licensed User
Los que quieras, es una base de datos. Consume muy poco, sobre todo si es texto. (puedes guardar mapas, listas, imagenes,...)
 
Top