Introduction
Huh, ist dies eine harte ein. WenigstensIch denke, so ... Dinge zu klären:OnClickListener nicht (korrekt) nach ConfigurationChange in Fragmente Arbeits
ich keine Antworten auf meine Frage nach der Suche im Internet (mit Google) gefunden wurde.
Alles, was ich wollte Menschen gefunden, die onClickListener
's für ihre View
ist falsch einrichten. Ich denke, es ist das gleiche Problem in meinem Fall, aber keines der anderen Probleme entsprach meinem.
This scheint das gleiche Problem zu sein ... Es hat keine Antworten.
Setup-
ich mit einem ViewPager
in meinem AppCompatActivity
zusammen drei Fragment
‚s eingerichtet haben.
viewPager = (ViewPager) findViewById(R.id.main_view_pager);
viewPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager()));
Behandelt von der SectionsPagerAdapter
.
public class SectionsPagerAdapter extends FragmentPagerAdapter {
SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return MainTextHolder.newInstance(tabIndicatorOnClick);
case 1:
return PostWriter.newInstance(tabIndicatorOnClick);
case 2:
return TopPage.newInstance(tabIndicatorOnClick);
default:
return Error.newInstance();
}
}
@Override
public int getCount() {
return 3;
}
// ... more methods
}
In jedem der Fragment
‚s ich einige Inhalte sowie eine benutzerdefinierte haben TabIndicator
.
(die folgende xml
Datei ist mein View
's für den Indikator)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<View
android:id="@+id/fragment_divider_one"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:tag="one" />
<View
android:id="@+id/fragment_divider_two"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:tag="two" />
<View
android:id="@+id/fragment_divider_three"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:tag="three" />
</LinearLayout>
Und dann stelle ich eine OnClickListener
für jede dieser View
' s (Teiler) in der Fragment
‚s onCreateView(LayoutInflater inflater, ViewGroup Bundle savedInstanceState)
Methode. Die OnClickListener
ist bereits in meinem Activity
vorbereitet, wo ich auch meine ViewPager
instanziiere, so dass ich die aktuelle Item
(Fragment
/tab) ändern kann.
private final View.OnClickListener tabIndicatorOnClick = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view.getTag().toString().equals("one"))
viewPager.setCurrentItem(0, true); // second argument for smooth transition
else if (view.getTag().toString().equals("two"))
viewPager.setCurrentItem(1, true);
else if (view.getTag().toString().equals("three"))
viewPager.setCurrentItem(2, true);
}
};
gebe ich, dass OnClickListener
auf die Fragment
ist, indem sie in meine newInstance(View.OnClickListener tabIndicatorOnClick)
Methode setzen.
Dies ist für eines der Fragmente. Es ist identisch für die anderen!
public static MainTextHolder newInstance(View.OnClickListener tabIndicatorOnClick) {
MainTextHolder fragment = new MainTextHolder();
Bundle args = new Bundle();
fragment.putIndicatorTabIndicatorOnClick(tabIndicatorOnClick);
fragment.setArguments(args);
fragment.setRetainInstance(true);
return fragment;
}
Meine putIndicatorTabIndicatorOnClick(View.OnClickListener tabIndicatorOnClick)
Methode ist ein Void
in einem Interface
. Es gilt nur die OnClickListener
an die Class
(Fragment
).
@Override
public void putIndicatorTabIndicatorOnClick(View.OnClickListener tabIndicatorOnClick) {
this.tabIndicatorOnClick = tabIndicatorOnClick;
}
Ist es
Ja, es funktioniert tut. Es funktioniert einwandfrei ... bis eine ConfigurationChange
passiert.In meinem Fall habe ich es mit getestet und die Ausrichtung geändert.
Das Problem
Was nach diesen ConfigurationChange
passiert ist, dass alles normal geht. Die OnClickListener
wird an alle View
's in alleFragment
' s angewendet, aber die tabIndicatorOnClick
OnClickListener
ist ein null Objektreferenz in der zweiten und dritten Fragment
.
So in PostWriter und TopPage gibt es nicht einmal wirklich ein OnClickListener
auf den View
ist für welchen Gründen auch immer. Aber es wird besser: In MainTextHolder
Fragment
ist das tabIndicatorOnClick
kein null object reference
, aber es ändert nicht die ViewPager
's Item
mehr. Es führt den Code, aber es scrollt nicht Tab
.
Wenn auf drehen „Do Aktivitäten nicht halten“ ind Entwickleroptionen des Gerätes und die App zu verlassen, alle OnClickListener
‚s sind null object references
. Auch solche in MainTextHolder
.
Zusammenfassung
Nach dem ConfigurationChange
die OnClickListener
wird in meine erste Fragment
vergangen, aber es ist nicht ordnungsgemäß funktioniert und in die verbleibenden Fragment
‚s es ist nicht einmal vergangen/a null object reference
.
Das Problem kann repliziert werden, indem die Activity
repliziert und dann neu geladen wird.
Am Ende ...
... Ich habe keine Ahnung, was falsch läuft. Ich hoffe, dass ich meine Frage richtig strukturiert habe.
von Interesse sein
minSdkVersion:
targetSdkVersion:
ich bereits eine SpringIndicator auf meinem ViewPager
haben. Dies hat keine OnClickListener
, so fügte ich meine eigenen "überlagerte" Indikatoren, die die erforderliche Funktion haben. Ich mag auch das Aussehen, aber wenn Sie mir eine bessere Lösung für meine TabIndicator
geben können, würde ich auch gerne als Antwort haben.
stieß ich auf die Lösung, die das Verfahren in setzen die xml
:onClick
mehrere Male zuschreiben, aber dafür würde ich die gleiche OnClickListener
für jeden Fragment
erstellen müssen, die nicht wirklich die nette Art und Weise ist, und es ist auch nicht Lösung mein Problem, aber ein Weg um es herum. - Ich müsste die ViewPager
in meine Fragment
und dann diese Methode von xml
, die, wie ich schon sagte, nur eine andere Möglichkeit, es zu tun und nicht die Art, wie ich es lieber tun. Auch ich weiß nicht, ob es funktioniert. Ich werde es wahrscheinlich testen.
Andere OnClickListener
's in der Fragment
funktionieren immer noch richtig. Also wie gesagt das Problem liegt in der OnClickListener
selbst nicht richtig funktioniert/ein null object reference
.
haben Sie versucht, in Ihrem Manifest zu ändern android: configChanges = "orientation | screenSize"? –
Das klingt wie ein Fragments-Lebenszyklusproblem. Können Sie bestätigen, dass Sie den Fehler replizieren können, indem Sie Entwickleroptionen aktivieren/Aktivitäten nicht beibehalten und dann die Home-Schaltfläche verwenden, um die Aktivität zu verlassen oder zu verlassen? –
@MilosLulic ja – creativecreatorormaybenot