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!

War es hilfreich?

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, Fragments 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top