getSupportFragmentManager getFragment sans étiquette ou l'id

Je suis l'élaboration d'une Tablette sous Android 3.1 application.

Je suis en utilisant ViewPager et des fragments sur une seule activité. Mon problème est que je ne sais pas comment mettre un ID ou une Étiquette à des fragments.

Activité

public class FillEReportFragmentActivity extends FragmentActivity
{
    ...

    /**
     * View Pager to manage form parts.
     */
    private ViewPager mViewPager;
    /**
     * Page Adapter to handle fragments.
     */
    private FillEReportFragmentPagerAdapter mPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstance)
    {
        Log.v("FillEReportFragmentActivity", "onCreate");

        super.onCreate(savedInstance);
        setContentView(R.layout.fill_ereport_paged);

        //Recoge los argumentos que le llegan de la actividad padre.
        Bundle extras = getIntent().getExtras();
        if (extras != null)
        {
            qapId = extras.getLong(BundleKeys.qapIdKey);
            orderId = extras.getLong(BundleKeys.orderIdKey);
            eReportId = extras.getLong(BundleKeys.eReportIdKey);
        }

        //Cargamos el E-Report o creamos uno nuevo. Además se recuperan los
        //artículos de la orden actual.
        LoadEReportAsyncTask task = new LoadEReportAsyncTask(this);
        task.execute(Long.toString(this.qapId));

        //Establezco los fragmentos (o partes del form) que se mostrarán en el
        //View Pager.
        mViewPager = (ViewPager)findViewById(R.id.pager);
        mPagerAdapter = new FillEReportFragmentPagerAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(mPagerAdapter);

        //Muestro en la parte inferior unos círculos para indicar donde me
        //encuentro dentro del E-Report.
        CirclePageIndicator mIndicator = (CirclePageIndicator)findViewById(R.id.indicator);
        mIndicator.setViewPager(mViewPager);

        //Creo unos tabs para poder navegar más facilmente a través de las
        //partes del E-Report.
        TabPageIndicator titleIndicator = (TabPageIndicator)findViewById(R.id.tabIndicator);
        titleIndicator.setViewPager(mViewPager);
    }

        ...
}

FragmentPagerAdapter

public class FillEReportFragmentPagerAdapter extends FragmentPagerAdapter
{
    private static final String[] TITLES = new String[] { 
        "Factory", 
        "Items" 
    };

    public FillEReportFragmentPagerAdapter(FragmentManager fm)
    {
        super(fm);
        //TODO Auto-generated constructor stub
    }

    @Override
    public Fragment getItem(int index)
    {
        switch (index)
        {
            case 0:
                return FactoryInfoFragment.newInstance();
            case 1:
                return ItemsFragment.newInstance();

        default:
            return null;
        }
    }

    @Override
    public int getCount()
    {
        return 2; //TODO: Este número hay que cambiarlo porque serán más.
    }

    public String getPageTitle(int position)
    {
        return TITLES[position];
    }
}

res/values/ids.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="frag_general_info_factory"/>
    <item type="id" name="frag_general_info_items"/>
</resources>

FactoryInfoFragment

public class FactoryInfoFragment extends Fragment
{
    public static FactoryInfoFragment newInstance()
    {
        FactoryInfoFragment frag = new FactoryInfoFragment();

        return frag;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
        Log.v("FactoryInfoFragment", "onCreateView");

        View v = inflater.inflate(R.layout.frag_general_info_factory, container, false);
    view.setId(R.id.frag_general_info_factory);

        return v;
    }
}

frag_general_info_factory.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_margin="10dp"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:shrinkColumns="*"  
    android:stretchColumns="*">

      <TableRow
        android:weightSum="1"> <!-- 0 -->
    <TextView
        android:id="@+id/txtGenInfo"
        android:layout_span="8"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/layout_title_general_information"
        android:textAppearance="?android:attr/textAppearanceLarge" />
      </TableRow>

      ...

</TableLayout>

Ici, je veux obtenir un fragment spécifique

private class LoadEReportAsyncTask extends AsyncTask<String, Void, Boolean>
{
private Context mContext;
private ProgressDialog loadingDialog;
private EReport eReport;
private QAP qap;
public LoadEReportAsyncTask(Context context)
{
Log.v("LoadEReportAsyncTask", "constructor");
eReport = null;
qap = null;
this.mContext = context;
loadingDialog = new ProgressDialog(mContext);
loadingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
loadingDialog.setMessage(getString(R.string.msg_loading_ereport));
loadingDialog.setCancelable(false);
loadingDialog.show();
}
@Override
protected Boolean doInBackground(String... params)
{
Log.v("LoadEReportAsyncTask", "doInBackground");
...
}
protected void onPostExecute(Boolean result)
{
Log.v("LoadEReportAsyncTask", "onPostExecute");
FillEReportFragmentActivity parentActivity = (FillEReportFragmentActivity) mContext;
if (result)
{
FactoryInfoFragment factFragment = (FactoryInfoFragment)getSupportFragmentManager().findFragmentById(R.id.frag_general_info_factory);
factFragment.fillEReport(eReport, qap);
Toast.makeText(getApplicationContext(), getString(R.string.msg_ereport_got_correct), Toast.LENGTH_SHORT).show();
ItemsFragment fragment = (ItemsFragment)getSupportFragmentManager().findFragmentById(R.id.frag_general_info_items);
fragment.setUpArticles(orderArticles);
}
else
{
Toast.makeText(getApplicationContext(), getString(R.string.msg_ereport_problem), Toast.LENGTH_LONG).show();
}
loadingDialog.dismiss();
}
}

Ici:

(FactoryInfoFragment)getSupportFragmentManager().findFragmentById(R.id.frag_general_info_factory);

- Je utiliser R.id.frag_general_info_factory pour obtenir que le fragment de référence, mais je reçois un null.

Comment puis-je définir une Balise ou un Id à FactoryInfoFragment?

Avez-vous trouvé une solution? Est-ce que votre code fonctionne maintenant? pouvez-vous partager le code de travail? Merci.
Dommage que personne n'a donné une bonne réponse à cette question que j'ai le même problème.
Je pense que la bonne réponse est que l'architecture de la solution est compliquée et le mal. Je n'ai jamais rencontré une situation où l'utilisation d'un ViewPager, trouver le fragment a été un problème, parce que si les fragments sont codés en dur (dans ce cas, c'est trivial car vous savez que les positions à l'avance), vous avez toujours accès à une source de données qui sauvegarde votre fragment de la carte et, par conséquent, vous pouvez utiliser l'adaptateur de source de données pour obtenir votre fragment.

OriginalL'auteur VansFannel | 2012-06-21