Ver la Versión Completa : [ SOLUCIONADO ] getIntent()
Merche300
08/04/18, 17:31:05
Tengo este metodo en una activity
class CActividades : AppCompatActivity()
fun Pdf(v: View) {
val intent = Intent(this, Pdf::class.java)
intent.putExtra("Nombre", textViewNombre !!.text.toString())
startActivity(intent)
}y lo que quiero es pasar estos datos a otra actividad en la cual creo un pdf pero me devuelve null, si me crea el el texto que añado pero no el dato que espero recibir
fun CreatePDF() {
var intent: Intent? = null
DatosChofer.add("8. Apellidos y nombre: " + intent.getStringExtra("Nombre"))
Esto es lo que me sale
8. Apellidos y nombre: null
¿Como es esto posible?
mocelet
09/04/18, 10:22:32
Muy buenas, supongo que has pegado mal el código porque según está te daría una NullPointerException (por el var intent: Intent? = null que lo usas en la siguiente línea, ¿dónde llamas al getIntent()?).
En Kotlin de hecho ni siquiera hace falta llamar al getIntent() explícitamente o almacenarlo en una variable porque Kotlin suele exponer los métodos del tipo getPatata() como patata. Basta llamar a intent.getStringExtra("loquesea"), no tienes que declarar la variable antes.
Me aseguraría también de que textViewNombre !!.text.toString() tiene el valor que necesitas, según está no creo que pueda valer null pero por si acaso.
Y también me aseguraría de que ese CreatePDF() se llama desde la actividad que recibe el intent y no desde otro sitio. ¿Lo llamas en el onCreate de la clase Pdf o dónde?
Por cierto, permíteme algunas sugerencias:
- usar nombres significativos que no te líen (tener una función que se llama Pdf y una clase que se llama Pdf no ayuda a la hora de comprender el código)
- escribir los nombres de métodos o funciones con la primera minúscula (es una convención del mundo Java/Kotlin) y los nombres de clases con la primera mayúscula.
- Los textos escritos a mano mejor guardarlos en una variable y referenciarla en el código en vez de copiar y pegar texto o volverlo a escribir. Si escribes en dos sitios "Nombre" igual en uno te equivocas y pones "Nobmre" y no te das cuenta y no funciona. Además del rollete que supone cambiar algo si decides renombrarlo.
- acostumbrarse a usar val en vez de var, Kotlin y en general los lenguajes funcionales animan a hacer uso de la inmutabilidad de modo que se tenga la certeza de que las variables tienen un valor y no va a estar cambiando.
Vaya tocho ha salido jaja, espero que alguna de esas ideas te funcione
Merche300
09/04/18, 13:48:59
intent.getStringExtra("Nombre"))
intent me sale en rojo
getIntent() me sale deprecated
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_pdf)
verifyStoragePermissions(this)
CreatePDF()
}
mocelet
10/04/18, 07:54:45
Lo único que he leído acerca de un getIntent deprecated es que lo estés llamando desde un fragment y no desde una activity. ¿Ese onCreate que pones en qué clase está y de qué tipo es?
Merche300
14/04/18, 09:08:24
Lo único que he leído acerca de un getIntent deprecated es que lo estés llamando desde un fragment y no desde una activity. ¿Ese onCreate que pones en qué clase está y de qué tipo es?
El activity que envia los datos, ressumido:
El getData() es el que me trae el nombre, en la app funciona correctamente
class CActividades : AppCompatActivity(), View.OnClickListener, AdapterView.OnItemSelectedListener {
var textViewNombre: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.c_actividades)
textViewNombre = findViewById(R.id.tv_nombre) as TextView
getData()
}
override fun onNothingSelected(parent: AdapterView<*>) {
textViewNombre !!.text = ""
}
fun pdf(v: View) {
val intent = Intent(this, Pdf::class.java)
intent.putExtra("Nombre", textViewNombre !!.text.toString())
startActivity(intent)
}
}
El que recibe los datos:
class Pdf : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_pdf)
verifyStoragePermissions(this)
createPdf()
}
companion object {
// Storage Permissions
private val REQUEST_EXTERNAL_STORAGE = 1
private val PERMISSIONS_STORAGE = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
fun verifyStoragePermissions(activity: Activity) {
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationa le(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE)
}
}
}
fun createPdf() {
//create document object
val document = Document()
//output file path
val date = Date()
val timeStamp = SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.getDefault()).format(date)
val dir = "${Environment.getExternalStorageDirectory()}/MyFolder"
File(dir).mkdirs()
val outpath = Environment.getExternalStorageDirectory().toString () + "/MyFile" +
File.separator + timeStamp + ".pdf"
try {
PdfWriter.getInstance(document, FileOutputStream(outpath))
document.open()
val fontCabecera = Font(Font.FontFamily.UNDEFINED, 10f, Font.BOLD, BaseColor.GRAY)
val fontNormalNegrita = Font(Font.FontFamily.UNDEFINED, 8f, Font.BOLD)
val fontNormalCursiva = Font(Font.FontFamily.UNDEFINED, 8f, Font.ITALIC)
val fontNormal = Font(Font.FontFamily.UNDEFINED, 8f)
val fontPequenya = Font(Font.FontFamily.UNDEFINED, 6f)
//var intent: Intent? = null
var intent = Intent()
DatosChofer.add("8. Apellidos y nombre: " + intent.getStringExtra("F. Nacimiento"))
DatosChofer.add(Chunk.NEWLINE)
document.close()
} catch (e: FileNotFoundException) {
// TODO Auto-generated catch block
e.printStackTrace()
} catch (e: DocumentException) {
// TODO Auto-generated catch block
e.printStackTrace()
}
}
}
}El boton para abrir el activity Pdf.kt
<Button
android:id="@+id/button_send"
android:text="SIGUIENTE"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginTop="20dp"
android:onClick="pdf"/>He de decir que el pdf se crea correctamente, lo unico es que no recibe los datos, puesto que esto es el resultado:
8. Apellidos y nombre: null
mocelet
14/04/18, 09:31:43
Tienes por ahí un var intent = Intent () antes de llamar al getStringExtra. El intent que necesitas es el de la actividad, no uno nuevo.
Merche300
14/04/18, 10:05:07
Tienes por ahí un var intent = Intent () antes de llamar al getStringExtra. El intent que necesitas es el de la actividad, no uno nuevo.
y donde esta ese intent, esto me lleva loco ya.
mocelet
14/04/18, 11:53:48
Aquí:
var intent = Intent()
DatosChofer.add("8llidos y nombre: " + intent.getStringExtra("F. Nacimiento"))
Que por cierto no sé por qué ahí pone 8llidos y en el PDF te sale 8. Apellidos, será algo de copiar y pegar en el foro
Merche300
14/04/18, 13:00:10
Aquí:
var intent = Intent()
DatosChofer.add("8llidos y nombre: " + intent.getStringExtra("F. Nacimiento"))
Que por cierto no sé por qué ahí pone 8llidos y en el PDF te sale 8. Apellidos, será algo de copiar y pegar en el foro
Gracias mocelet, si es al copiar y pegar es lo del apellido, intent en rojo a no ser que antes le ponga var intent = Intent() , lo que he hecho es pasarlo dentro del onCreate y esta funcionando.
mocelet
14/04/18, 14:27:25
Ah, eso es que la función createPdf la tienes en el companion object no en la actividad, por eso te sale en rojo. El companion object es como el static de Java, solo puedes llamar a métodos static de la clase (y el getIntent no lo es).
De todas formas es más legible extraer los datos en el onCreate como has hecho que andar a mitad del código consultando un intent que poco tiene que ver con la funcionalidad implementada (una función cuya misión es crear PDFs no debería saber nada de intents, solo saber qué texto tiene que añadir)
Merche300
14/04/18, 17:12:29
Entonces lo dejo así, en el onCreate
vBulletin® v3.8.1, Copyright ©2000-2026, Jelsoft Enterprises Ltd.