![]() |
|
| 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 |
«
Tema Anterior
|
Siguiente tema
»
|
|
Herramientas |
|
#1
|
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 |
|
|
|
#2
|
||||
|
||||
|
fragment.getView().findViewById(......)
|
| Gracias de parte de: | ||
|
#3
|
|
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 |
|
#4
|
||||
|
||||
|
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(...) Y luego ya la línea que te puso kriogeN escrita tal cual para encontrar la view del fragment. |
| Gracias de parte de: | ||
|
#5
|
|
|
Cita:
[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 .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! |
|
#6
|
||||
|
||||
|
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. |
| Gracias de parte de: | ||
|
#7
|
|
|
Cita:
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">
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 |
|
#8
|
||||
|
||||
|
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. |
| Respuesta |
Estás aquí
|
||||||
|
||||||
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 23:15:25 (GMT +1)
HTCMania: líderes desde el 2007

Urgente. Ayuda al llamar a un objeto





