Convertir intención en fragmento en Android
-
20-12-2019 - |
Pregunta
En general, la mayor parte del tiempo trabajo con Intent en lugar de Fragment porque lo encontré de alguna manera complejo.Tengo una clase con ListView para mostrar algunos datos de una matriz y quiero convertirla en Fragmento, también quiero pasar los extras en una nueva clase fragmentada.
Clase de vista de lista:
public class MainActivity extends Activity {
ListView list;
String[] web = { "Google", "Twitter", "Windows", "Bing", "Itunes",
"Wordpress", "Drupal" };
Integer[] imageId = { R.drawable.ic_launcher, R.drawable.ic_launcher,
R.drawable.ic_launcher, R.drawable.ic_launcher,
R.drawable.ic_launcher, R.drawable.ic_launcher,
R.drawable.ic_launcher
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomList adapter = new CustomList(MainActivity.this, web, imageId);
list = (ListView) findViewById(R.id.list);
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this,
"You Clicked at " + web[+position], Toast.LENGTH_SHORT)
.show();
Intent i = new Intent(MainActivity.this, intent.class);
i.putExtra("name", web[+position]);
startActivity(i);
}
});
}
}
Clase de lista personalizada:
public class CustomList extends ArrayAdapter<String> {
private final Activity context;
private final String[] web;
private final Integer[] imageId;
public CustomList(Activity context, String[] web, Integer[] imageId) {
super(context, R.layout.list_single, web);
this.context = context;
this.web = web;
this.imageId = imageId;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.list_single, null, true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.txt);
ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
txtTitle.setText(web[position]);
imageView.setImageResource(imageId[position]);
return rowView;
}
}
Obtuve una clase principal con tres pestañas creadas usando fragmentos y en esta clase me gustaría agregar ListView.
public class LayoutOne extends Fragment {
public static Fragment newInstance(Context context) {
LayoutOne f = new LayoutOne();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.layout_one, null);
return root;
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
}
Lo que quiero hacer es mostrar la vista de lista en la clase de fragmento y cuando se haga clic en un elemento de la lista, quiero iniciar la Nueva intención para mostrar en qué elemento se hizo clic.
Solución
Si desea pasar parámetros a un Fragmento, la práctica común es crear un método estático que produzca una instancia de su Fragmento con ciertos parámetros.ya tienes el newInstance
método, ahora solo necesita agregar parámetros a los argumentos y devolver el Fragmento.Deberías comprobar los argumentos en tu onCreateView
El siguiente es un ejemplo de cómo escribirías uno.
public class LayoutOne extends Fragment
{
public static Fragment newInstance(int someInt, String someString)
{
LayoutOne f = new LayoutOne();
Bundle args = new Bundle();
args.putInt("someInt", someInt);
args.putString("someString", someString);
f.setArguments(args);
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.layout_one, null);
Bundle args = getArguments();
//From here you would check to see if your arguments are present
//proceed accordingly
return root;
}
}
Para su caso específico, puede pasar la matriz String y agregarla como argumento.
Espero que esto ayude.¡Buena suerte!
Editar
El problema al que te enfrentas es que estás creando una instancia de un ListView
en tus Activity
cuando en realidad deberías hacerlo en tu Fragment
.Las intenciones no son necesarias aquí, solo debes asegurarte de que haya una ListView
atributo para obtener del diseño que adjunta a su Fragment
.El siguiente es un pequeño ejemplo de cómo debería funcionar.
Tenga en cuenta que este método va en su LayoutOne
clase
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.layout_one, null);
//Be sure to use the actual id of your list view
ListView lv = (ListView) root.findViewById(R.id.list_view_id);
//Make sure that you retrieve the values for 'web' and 'imageId' from
//the activity using the "newInstance" method.
CustomList adapter = new CustomList(getActivity(), web, imageId);
lv.setAdapter(adapter);
//From here, set your onClickListener and stuff as you did in your Activity
return root;
}
Como nota, Fragment
no tenemos el findViewById
método.Tienes que llamarlo al View
que estás inflando para ser su diseño, por lo que en este caso inflaste root
y luego llamarías root.findViewById(R.id.some_id)
para tener una vista.