Home Menu

Menu



Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android


 
Herramientas
  #1  
Viejo 26/07/14, 13:37:49
Avatar de Guixe94
Guixe94 Guixe94 no está en línea
Desarrollador
Mensajes: 900
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Versión de ROM: Ultima Orange Stock
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
rom Urgente. Ayuda al llamar a un objeto

Hola,

yo tenia mi app toda con miles de actividades pero ahora la estoy reaciendo con fragments voy tirando pero me he encontrado con un problema.
Resulta que tengo una actividad con dos ScrollViews uno visible y otro no y al realizar una compra integrada pues se intercambian los estados ( el que estava visible pasa a invisible y a la inversa). Con la actividad era muy facil por que en su clase llamaba a los scrollsviews por su id con el siguiente codigo:

[PHP]private ScrollView scrollpro1;
private ScrollView scrollpro2;[/PHP]

Pero ahora al pasarlo a fragments tengo un problema.. si pongo ese codigo no me funciona ya que me busca esas id's en la actividad principal (MainActivity) que es donde llamo a mostrar a los fragments pero claro los scrollviews no estan en ese .xml si no que estan en el del fragment..

No puedo llamar directamente al boton y decirle que me lo cambie ya que dependiendo de si el producto se compra o no pues se ve el primero o el segundo..
Cuando llamo al boton utilizo este codigo:
[PHP]public void boton(View view) {
Intent intent = new Intent(this, MainActivity.class);
startBuyProcess();

}[/PHP]

y El proceso de compra es este:
[PHP]///// compras




private void startBuyProcess(){
String clave = "MI CLAVEEEEEEEEE";

billingHelper = new IabHelper(this, clave);
billingHelper.startSetup(this);
}



@Override
public void onIabSetupFinished(IabResult result) {

if (result.isSuccess()) {

try{
if(billingHelper.queryInventory(true, null).hasPurchase(MainActivity.SKU)){
Toast.makeText(this, "Licencia Correcta", Toast.LENGTH_SHORT).show();
// startActivity(new Intent(MainActivity.this,Pro.class));
scrollpro1.setVisibility(View.GONE);
scrollpro2.setVisibility(View.VISIBLE);
compraCorrecta();





} else {
compraElemento();
}

} catch(IabException e){
e.printStackTrace();
}

} else {

errorAlIniciar();
}

}


protected void errorAlIniciar() {
Toast.makeText(MainActivity.this, "Error al intentar iniciar la compra", Toast.LENGTH_SHORT).show();
}


protected void compraElemento() {
purchaseItem(PurchaseActivity.SKU);
}


protected void purchaseItem(String sku) {
billingHelper.launchPurchaseFlow(this, sku, 123, this);
}


@Override
public void onIabPurchaseFinished(IabResult result, Purchase info) {


if (result.isFailure()) {
compraFallida();
} else if (MainActivity.SKU.equals(info.getSku())) {
compraCorrecta();


// Consumimos los elementos a fin de poder probar varias compras
billingHelper.consumeAsync(info, null);

}

}



/*
* COSAS QUE QUERAMOS HACER CUANDO SE HAYA
* ADQUIRIDO EL PRODUCTO CON EXITO
*
protected void compraCorrecta() {


boton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// startActivity(new Intent(MainActivity.this,Pro.class));
scrollpro1.setVisibility(View.GONE);
scrollpro2.setVisibility(View.VISIBLE);


}
});





}

/*
* COSAS QUE QUERAMOS HACER CUANDO EL PRODUCTO
* NO HAYA SIDO ADQUIRIDO
*

protected void compraFallida(){

}




//LIMPIAMOS
@Override
protected void onDestroy() {
disposeBillingHelper();
super.onDestroy();
}

private void disposeBillingHelper() {
if (billingHelper != null) {
billingHelper.dispose();
}
billingHelper = null;
}





private Boolean isUpgrade(Context context)
{
SharedPreferences prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
return prefs.getBoolean("upgrade", false);
}

private void setUpgrade(Context context, Boolean value)
{
SharedPreferences prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean("upgrade", value);
edit.commit();
}




///// Fin compras[/PHP]


Y aqui es donde me peta ya que intenta cambiar la visibilidad de esos scrollviews pero no los encuentra en activity_main.xml por que estan en el fragment purchase.xml

[PHP]if(billingHelper.queryInventory(true, null).hasPurchase(MainActivity.SKU)){
Toast.makeText(this, "Licencia Correcta", Toast.LENGTH_SHORT).show();
// startActivity(new Intent(MainActivity.this,Pro.class));
scrollpro1.setVisibility(View.GONE);
scrollpro2.setVisibility(View.VISIBLE);
compraCorrecta();[/PHP]

Como podria llamar a esos scrollviews que no estan en la actividad principal? Hay alguna manera?


SOLUCIONADO

Al final utilice este codigo gracias a las dos respuestas recibidas y conseguí hacerlo funcionar!

[PHP]getSupportFragmentManager().findFragmentById(R.id. content_frame);

scrollpro1 = (ScrollView)findViewById(R.id.scrollpro1);
scrollpro2 = (ScrollView)findViewById(R.id.scrollpro2);[/PHP]

Gracias

Última edición por Guixe94 Día 27/07/14 a las 02:36:35 Razón: Solucionado
Responder Con Cita


  #2  
Viejo 26/07/14, 14:59:03
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
fragment.getView().findViewById(......)
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 26/07/14, 15:19:34
Avatar de Guixe94
Guixe94 Guixe94 no está en línea
Desarrollador
Mensajes: 900
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Versión de ROM: Ultima Orange Stock
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por kriogeN Ver Mensaje
fragment.getView().findViewById(......)
Gracias. Lo he puesto asi:
[PHP]scrollpro1 = (ScrollView) PurchaseActivity.getView().findViewById(R.id.scrol lpro1);[/PHP]

Pero me da un nullpointerexception ma falta algo? lo he puesto bien?

Última edición por Guixe94 Día 26/07/14 a las 15:31:28
Responder Con Cita
  #4  
Viejo 26/07/14, 17:55:18
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
En la respuesta de kriogeN, fragment es la instancia del fragment que tenga la vista que quieres.

Puedes obtenerla así:

Código:
Fragment fragment = getSupportFragmentManager().findFragmentById(...)
con el identificador del fragment que hayas puesto.

Y luego ya la línea que te puso kriogeN escrita tal cual para encontrar la view del fragment.
Responder Con Cita
Gracias de parte de:
  #5  
Viejo 26/07/14, 21:49:45
Avatar de Guixe94
Guixe94 Guixe94 no está en línea
Desarrollador
Mensajes: 900
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Versión de ROM: Ultima Orange Stock
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por mocelet Ver Mensaje
En la respuesta de kriogeN, fragment es la instancia del fragment que tenga la vista que quieres.

Puedes obtenerla así:

Código:
Fragment fragment = getSupportFragmentManager().findFragmentById(...)
con el identificador del fragment que hayas puesto.

Y luego ya la línea que te puso kriogeN escrita tal cual para encontrar la view del fragment.
Hola! He puesto el codigo asi:

[PHP]android.support.v4.app.Fragment fragment = getSupportFragmentManager().findFragmentById(R.lay out.activity_purchase);
fragment.getView().findViewById(R.id.scrollpro1);
fragment.getView().findViewById(R.id.scrollpro2);[/PHP]
(he tenido que poner el v4 ya que tengo la clase principal se extiende a un FragmentActivity por que si no no me reconocia el FragmentManager y pues lo demas lo tengo con android.app.Fragment pero me reconocia como si fuese v4.. bueno un lio pero con eso lo solucioné)
Pero ahora cuando intento abrir la app me salta este error

Código:
07-26 15:40:56.916  12136-12136/com.barwill94.wikicraft E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.barwill94.wikicraft, PID: 12136
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.barwill94.wikicraft/com.barwill94.wikicraft.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.support.v4.app.Fragment.getView()' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317)
            at android.app.ActivityThread.access$800(ActivityThread.java:143)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5070)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.support.v4.app.Fragment.getView()' on a null object reference
            at com.barwill94.wikicraft.MainActivity.onCreate(MainActivity.java:100)
            at android.app.Activity.performCreate(Activity.java:5720)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1102)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2208)
************at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317)
************at android.app.ActivityThread.access$800(ActivityThread.java:143)
************at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
************at android.os.Handler.dispatchMessage(Handler.java:102)
************at android.os.Looper.loop(Looper.java:135)
************at android.app.ActivityThread.main(ActivityThread.java:5070)
************at java.lang.reflect.Method.invoke(Native Method)
************at java.lang.reflect.Method.invoke(Method.java:372)
************at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
************at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)
El R.layout.activity_purchase es el xml donde estan los ScrollViews he puesto eso por que no entendia muy bien a que te referias con el identificador del Fragment y creo que no es eso.. pero en StackOverflow he visto que salia asi.. podrias confirmarmelo?

el .java del fragment que quiero poner es este:

[PHP]public class PurchaseActivity extends Fragment {
public static final String SKU = "premium_item";
public ScrollView scrollpro1;
public ScrollView scrollpro2;

private IabHelper billingHelper;
private Button boton;

public PurchaseActivity(){


}






@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {



View rootView = inflater.inflate(R.layout.activity_purchase, container, false);

return rootView;
}




}[/PHP]

Muchas Gracias!
Responder Con Cita
  #6  
Viejo 26/07/14, 22:22:28
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Si no usabas la biblioteca de soporte haber puesto solo getFragmentManager. O pones en los import los de la biblioteca de soporte o pones los "normales", pero no los mezcles.

El id no es el layout, es el id (R.id.algo), donde algo es el nombre que tenga el contenedor del fragment, que será un linear layout supongo.
Responder Con Cita
Gracias de parte de:
  #7  
Viejo 26/07/14, 22:24:52
Avatar de Guixe94
Guixe94 Guixe94 no está en línea
Desarrollador
Mensajes: 900
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Versión de ROM: Ultima Orange Stock
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por mocelet Ver Mensaje
Si no usabas la biblioteca de soporte haber puesto solo getFragmentManager. O pones en los import los de la biblioteca de soporte o pones los "normales", pero no los mezcles.

El id no es el layout, es el id (R.id.algo), donde algo es el nombre que tenga el contenedor del fragment, que será un linear layout supongo.
Supongo que te referiras al id que tiene el donde se muestran los fragments digamos de la actividad principal osea este que tengo en el main.xml:

Código:
<FrameLayout
        android:name="android.support.v4.app.ListFragment"

        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:background="@color/DodgerBlue">
He puesto R.id.content_frame pero me sigue saltando el mismo error

Edito: El problema principal me sale que esta en la linea 100 que es esta:
[PHP] scrollpro1 = (ScrollView)fragment.getView().findViewById(R.id.s crollpro1);[/PHP]

Si la quito me sale la siguiente que es la misma pero con el scrollpro2
Si quito esas dos lineas y dejo solo el codigo anterior no hay ningun problema puedo iniciar la app y todo lo unico no me va esa función el problema es que esos dos objetos me los detecta como null osea que no los detecta vamos..
Perdon si soy pesado es para dejar los maximos datos posibles para ver si asi almenos puedo ayudar un poco yo.

Muchas gracias por la ayuda y el tiempo.

Última edición por Guixe94 Día 26/07/14 a las 22:36:55
Responder Con Cita
  #8  
Viejo 27/07/14, 11:14:44
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
Por lo que veo el Fragment lo añades por código, guarda la instancia en el momento en el que lo creas y la usas después.

Si te falla en esas 2 líneas supongo que es porque te estará dando un NullPointerException al ser fragment null.
Responder Con Cita
Respuesta

Estás aquí
Regresar   HTCMania > Todo sobre Android > Programación y Desarrollo para Android


Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 23:15:25 (GMT +1)

Cookies
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007