Absicht in Fragment in Android konvertieren
-
20-12-2019 - |
Frage
Im Allgemeinen arbeite ich die meiste Zeit eher mit Absicht als mit Fragmenten, weil ich es irgendwie komplex fand.Ich habe eine Klasse mit Listenansicht, um einige Daten aus einem Array anzuzeigen, und ich möchte sie in Fragmente konvertieren und auch die Extras in einer neuen fragmentierten Klasse übergeben.
Listenansicht-Klasse:
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);
}
});
}
}
Benutzerdefinierte Listenklasse:
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;
}
}
Ich habe eine Hauptklasse mit drei Registerkarten, die mit fragment erstellt wurden, und in dieser Klasse möchte ich die Listenansicht hinzufügen!
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);
}
}
Was ich tun möchte, ist, die Listenansicht in der Fragmentklasse anzuzeigen, und wenn auf ein Listenelement geklickt wird, möchte ich die neue Absicht starten, um anzuzeigen, auf welches Element geklickt wurde!
Lösung
Wenn Sie Parameter an ein Fragment übergeben möchten, erstellen Sie üblicherweise eine statische Methode, die eine Instanz Ihres Fragments mit bestimmten Parametern erzeugt.Sie haben bereits die newInstance
methode, jetzt müssen Sie nur noch Parameter zu den Argumenten hinzufügen und das Fragment zurückgeben.Sie sollten nach den Argumenten in Ihrem suchen onCreateView
Das Folgende ist ein Beispiel dafür, wie Sie einen schreiben würden.
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;
}
}
Für Ihren speziellen Fall könnten Sie das String-Array übergeben und als Argument hinzufügen.
Hoffe das hilft.Toi toi toi!
Bearbeiten
Das Problem, mit dem Sie konfrontiert sind, ist, dass Sie a instanziieren ListView
in Ihrem Activity
wenn du es in Wirklichkeit in deinem tun solltest Fragment
.Absichten werden hier nicht benötigt, Sie müssen nur sicherstellen, dass es eine gibt ListView
attribut, das aus dem Layout abgerufen werden soll, das Sie an Ihr Layout anhängen Fragment
.Das Folgende ist ein kleines Beispiel dafür, wie das funktionieren sollte.
Beachten Sie, dass diese Methode in Ihre LayoutOne
Klasse
@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;
}
Als Hinweis, Fragment
s haben nicht die findViewById
Methode.Sie müssen es auf der anrufen View
dass Sie aufblasen, um sein Layout zu sein, also haben Sie in diesem Fall aufgeblasen root
und dann würdest du anrufen root.findViewById(R.id.some_id)
um eine Aussicht zu bekommen.