|
||
|
|
|
|||||||
| 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
|
||||
|
||||
|
Se puede mostrar fragment mediante un string?
Hola,
Quiero mostrar fragments aleatoriamente, y bueno eso ya lo tengo funcionando el problema es que utilizo un numero aleatorio y dependiendo de este numero pues utilizo un Case 0, case 1, etc para abrir cada fragment, estos fragments son diferentes niveles y el problema viene aqui, quiero hacer mas de 100 niveles y claro eso seria un codigo super largo.. Todos los niveles se llaman NivelX (donde X va un numero, por ejemplo Nivel5), hay alguna manera de que me genere el numero aleatorio y despues por ejemplo si el numero es 6 me muestre el fragment 6? Mi codigo actual es el siguiente: [PHP]public class Xtreme extends Activity { String SiguienteNivel; static int randomFragmentNum; static int NivelesTotales=30; static Random random = new Random(); FragmentManager fragmentManager = getFragmentManager(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_xtreme); randomFragmentNum = random.nextInt(7); Fragment(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.xtreme, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public void Fragment() { switch (randomFragmentNum) { case 0: { fragmentManager.beginTransaction().replace(R.id.co ntainer, new Nivel1()).commit(); break; } case 1: { fragmentManager.beginTransaction().replace(R.id.co ntainer, new Nivel2()).commit(); break; } case 2: { fragmentManager.beginTransaction().replace(R.id.co ntainer, new Nivel3()).commit(); break; } case 3: { fragmentManager.beginTransaction().replace(R.id.co ntainer, new Nivel4()).commit(); break; } case 4: { fragmentManager.beginTransaction().replace(R.id.co ntainer, new Nivel5()).commit(); break; } case 5: { fragmentManager.beginTransaction().replace(R.id.co ntainer, new Nivel6()).commit(); break; } case 6: { fragmentManager.beginTransaction().replace(R.id.co ntainer, new Nivel7()).commit(); break; } case 7: { fragmentManager.beginTransaction().replace(R.id.co ntainer, new Nivel8()).commit(); break; } } }[/PHP]
__________________
|
|
|
|
#2
|
||||
|
||||
|
Si no necesitas compatibilidad con Gingerbread y anteriores puedes usar Fragment.instantiate:
Fragment fragment = Fragment.instantiate(context, "nombrepaquete.nombreclasefragment"); Si quieres que sea compatible con versiones anteriores tendrás que usar reflexión: Fragment fragment = (Fragment)Class.forName("nombrepaquete.nombreclase fragment").getConstructor().newInstance(); IMPORTANTE: En ambos casos tendrás que incluir en la configuración de ProGuard que haga un "keep" de las clases que heredan de Fragment. Si no tu aplicación dejará de funcionar tras pasar por ProGuard. |
|
#3
|
||||
|
||||
|
Si no necesitas compatibilidad con Gingerbread y anteriores puedes usar Fragment.instantiate:
Fragment fragment = Fragment.instantiate(context, "nombrepaquete.nombreclasefragment"); Si quieres que sea compatible con versiones anteriores tendrás que usar reflexión: Fragment fragment = (Fragment)Class.forName("nombrepaquete.nombreclase fragment").getConstructor().newInstance(); IMPORTANTE: En ambos casos tendrás que incluir en la configuración de ProGuard que haga un "keep" de las clases que heredan de Fragment. Si no tu aplicación dejará de funcionar tras pasar por ProGuard. ![]() En stackoverflow me dieron esta respuesta: [PHP]try{ Fragment f = (Fragment)(Class.forName("com.example.Fragment"+i) .newInstance()); fragmentManager.beginTransaction().replace(R.id.co ntainer,f).commit(); }catch(ClassNotFoundException e){ Log.e("loading level","level class not found",e); }[/PHP] Cambie com.example.fragment por es.bawi.onesecond.Nivel y en la variable "i" es el numero que me genera aleatoriamente. Tengo puesto ese codigo en el oncreate de la actividad, pero resulta que no me muestra nada, sabes en que estoy fallandO? Merci! ;)
__________________
|
![]() |
Estás aquí
|
||||||
|
||||||