Question

En général, la plupart du temps, je travaille avec l'intention plutôt qu'avec le fragment parce que je l'ai trouvé en quelque sorte complexe.J'ai une classe avec ListView pour afficher certaines données d'un tableau et je souhaite les convertir en Fragment et je souhaite également transmettre les extras dans une nouvelle classe fragmentée.

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);

            }
        });

    }

}

Classe CustomList :

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;
    }
}

J'ai une classe principale avec trois onglets créés à l'aide de fragment et dans cette classe, j'aimerais ajouter 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);

    }

}

Ce que je veux faire, c'est afficher la vue de liste dans la classe de fragment et lorsqu'un élément de liste sera cliqué, je souhaite lancer la nouvelle intention pour montrer sur quel élément a été cliqué !

Était-ce utile?

La solution

Si vous souhaitez transmettre des paramètres dans un fragment, la pratique courante consiste à créer une méthode statique qui produit une instance de votre fragment avec certains paramètres.Vous avez déjà le newInstance méthode, il vous suffit maintenant d’ajouter des paramètres aux arguments et de renvoyer le Fragment.Vous devriez vérifier les arguments dans votre onCreateView Ce qui suit est un exemple de la façon dont vous en écririez un.

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;

    }
}

Pour votre cas spécifique, vous pouvez transmettre le tableau String et l'ajouter comme argument.

J'espère que cela t'aides.Bonne chance!

Modifier

Le problème auquel vous êtes confronté est que vous instanciez un ListView dans ton Activity alors qu'en réalité vous devriez le faire dans votre Fragment.Les intentions ne sont pas nécessaires ici, vous devez simplement vous assurer qu'il existe un ListView attribut à obtenir de la mise en page que vous attachez à votre Fragment.Ce qui suit est un petit exemple de la façon dont cela devrait fonctionner.

Notez que cette méthode va dans votre 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;

}

En guise de remarque, Fragmentje n'ai pas le findViewById méthode.Vous devez l'appeler au View que vous gonflez pour en faire la mise en page, donc dans ce cas vous avez gonflé root et puis tu appellerais root.findViewById(R.id.some_id) pour avoir une vue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top