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.
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
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas essayé, mais je ne sais pas si
findFragmentById()
fonctionnera correctement dans ce cas, étant donné qu'il n'y a effectivement plus d'un fragment de la ViewPager conteneur.Si vous regardez le code source de la
FragmentPagerAdapter
vous pouvez voir comment c'est à l'aide de balises à l'interne. Alors peut-être vous remplacerinstantiateItem()
dans votre personnalisé pager carte, de copier le code deFragmentPagerAdapter
et de l'ajuster à l'utilisation des balises que vous pouvez également utiliser ailleurs dans votre code pour récupérer les fragments de vous-même.Par exemple, si votre PagerAdapter mise en œuvre pourrait être spécifique à ce problème, vous pourriez faire quelque chose d'aussi simple que cela:
instantiateItem
n'est jamais appelée. Je voisonCreateView
etonResume
sur mon journal, mais je ne vois pas du tout appel àinstantiateItem
.hmm, peut-être que vous avez mise en place au mauvais endroit? Il doit être un membre de votre
FillEReportFragmentPagerAdapter
. C'est finalement ce que les appelsgetItem()
. Donc, sigetItem
est appelé, vous pouvez être sûr queinstantiateItem
est appelé.instantiateItem
est appelé, puis il appellegetItem
. Comme vous pouvez le voir sur monFragmentPagerAdapter
code, je crée des fragments de getItem donc, je pense, il est impossible de définir un Identifiant à un fragment de ce qu'il n'est pas encore créé. Probablement que je ne suis pas le faire avec mon code.OriginalL'auteur Scott W
Dans ce cas, il ressemble
findFragmentById()
etfindFragmentByTag()
ne seront pas faire le travail de façon à ce que je voudrais faire est de stocker l'ensemble de vosFragments
dans unArrayList<Fragment>
de sorte que vous pouvez accéder à partir de vos deuxAdapter
et laAsyncTask
.OriginalL'auteur monchote
Vous pouvez obtenir un Fragment à l'aide de la
id
de la Vue de la ViewPager ajoute:Votre problème est de trouver cet id. J'ai couru à travers le le code source pour
ViewPager
et il ne saute pas, si tout ce que je voudrais suggérer qu'il utilise lui-même (unViewGroup
) alors l'id à utiliser dans ce cas seraitR.id.pager
;NB
Vous pouvez également être très prudent lorsque l'on mélange
android.support.v4.app.Fragment
etandroid.app.Fragment
- Cela signifie que la différence entre l'utilisation de la fonctionnalité de la bibliothèque de prise en charge ou dans le Nid d'abeille+ API.je.e, si vous utilisez
android.support.v4.app.Fragment
:d'autre si vous utilisez
android.app.Fragment
:ViewPager
etfragments
, dois-je utiliserandroid.support.v4
?non, vous ne le font pas. simplement, si vous voulez que votre application fonctionne sur la pré 3.0
si vous utilisez 3.1 vous ne devriez pas avoir l'android-support-v4.jar dans votre projet (autant que je sache) et ne devraient donc pas être l'aide d'android.de soutien.v4,
Mon problème est que je ne connais pas l'id de la vue que j'ai ajouté. Comment puis-je savoir que l'id?
Mais... je vois que
ViewPager
est seulement surandroid.support.v4.view.ViewPager
paquet.OriginalL'auteur Graeme
Vous pouvez essayer de remplacer
dans votre
FragmentPagerAdapter
d'enregistrer ou de définir l'identifiant du conteneurViewGroup
et ensuite appelersuper
.Ensuite, vous pouvez l'utiliser id sur
getSupportFragmentManager().findFragmentById()
pour récupérer le fragment.Laissez-moi savoir si cela fonctionne!
instantiateItem
n'est jamais appelée. Je voisonCreateView
etonResume
sur mon journal, mais je ne vois pas du tout appel àinstantiateItem
.Je suis à l'aide d'un ViewPager et je ne sais pas comment appeler
instantiateItem
.Vous devez remplacer
instantiateItem
dans votreFillEReportFragmentPagerAdapter
, pas dans votreFactoryInfoFragment
.Désolé, je vois que
instantiateItem
est exécuté, mais j'ai fait ce que tu m'a dit (j'ai mis un nouvel Id) et j'ai un null.Est le
ViewGroup container
null lorsque l'instantiateItem
est appelé?OriginalL'auteur monchote
Vous pouvez obtenir un fragment à l'aide de Fragmentmanager sans étiquette ou l'id. Essayez ceci,
OriginalL'auteur emilpmp