A conversão de Intenção para a fragmentação no Android
-
20-12-2019 - |
Pergunta
Em geral, a maior parte do tempo eu trabalho com a Intenção de, ao invés de Fragmentar porque eu achei um pouco complexo.Eu tenho uma classe com ListView para mostrar alguns dados a partir de uma matriz e eu quero convertê-lo em Fragmento também quer passar os extras em uma nova fragmentado classe.
Classe ListView:
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);
}
});
}
}
CustomList Classe:
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;
}
}
Eu tenho uma classe principal com três separadores criados usando o fragmento e nesta classe eu gostaria de adicionar o 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);
}
}
O que eu quero fazer é mostrar o listview no fragmento de classe e quando um item de lista serão clique em quero lançar o Novo Intenção de mostrar qual o Item que foi clicado!
Solução
Se você deseja passar parâmetros para um Fragmento, uma prática comum é criar um método estático que produz uma instância de seu Fragmento com determinados parâmetros.Você já tem o newInstance
o método, agora você só precisa adicionar parâmetros para o retorno e argumentos Fragmento.Você deve verificar os argumentos em seu onCreateView
A seguir está um exemplo de como você poderia escrever um.
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 o seu caso específico, você pode passar ao longo da matriz de Seqüência de caracteres e adicioná-lo como um argumento.
Espero que isso ajude.Boa sorte!
Editar
O problema que você está enfrentando é que você está instanciando um ListView
em seu Activity
quando, na realidade, você deve estar fazendo isso em seu Fragment
.Intenções não são necessários aqui, você só precisa se certificar de que há uma ListView
atributo para começar a partir do layout que você anexar à sua Fragment
.O seguinte é um pequeno exemplo de como isso deve funcionar.
Note que este método vai na sua LayoutOne
classe
@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 uma nota, Fragment
s não tem a findViewById
o método.Você tem que chamar o View
o que você está inflando para ser seu layout, então neste caso você inflado root
e, em seguida, você poderia chamar root.findViewById(R.id.some_id)
para obter uma visão.