UPDATE: Ich dachte, es hat richtig funktioniert. Aber nach einigen Tests gibt es immer noch Probleme * schnüffeln *
Dann habe ich eine einfachere Version gemacht, um zu sehen, was genau passiert, und ich erfahre, dass das erfrischende Fragment, das hätte entfernt werden sollen, immer noch dort geblieben ist. Oder genau die Ansicht des alten Fragments, das dort oben auf dem neueren Fragment verbleibt. Da der Hintergrund meiner ursprünglichen App durch RecyclerView nicht transparent ist, stellte sich heraus, was ich zuvor gesagt habe.
ENDE DES UPDATE
Ich habe ein MainActivity
Layout wie dieses:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_height="match_parent">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout android:id="@+id/container" android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
If you're not building against API 17 or higher, use
android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
the container. -->
<fragment android:id="@+id/navigation_drawer"
android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent"
android:layout_gravity="start" tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>
Das Fragment, das ContentView
ich zum Füllen verwende, @id/container
ist wie folgt konfiguriert:
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/contentView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/tweet_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/grey_300"/>
</android.support.v4.widget.SwipeRefreshLayout>
Und hier ist onCreateView()
vonContentView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View inflatedView = inflater.inflate(R.layout.fragment_content, container, false);
mRecyclerView = (RecyclerView) inflatedView.findViewById(R.id.tweet_list);
mRecyclerView.setHasFixedSize(false);
mLinearLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
mRecyclerView.setLayoutManager(mLinearLayoutManager);
mTweetList = new ArrayList<Tweet>;
mAdapter = new TweetAdapter(mTweetList);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mSwipeRefreshLayout = (SwipeRefreshLayout) inflatedView.findViewById(R.id.contentView);
mSwipeRefreshLayout.setOnRefreshListener(
...
);
return inflatedView;
}
Dann schalte MainActivity
ich in den Inhalt um, um anzuzeigen, indem ich anders wechsle ContentView
. Bis auf eines sieht alles gut aus: Wenn ich ContentView
während der Aktualisierung durch die Navigationsschublade die Fragmente wechsle, friert der Inhalt ein. Aber eigentlich funktionieren alle Dinge wie gewohnt, außer dass Sie es nicht sehen können.
Antworten:
Nun ... Nach einigem Kämpfen habe ich dieses Problem schließlich auf knifflige Weise selbst gelöst ...
Ich muss nur diese hinzufügen in
onPause()
:@Override public void onPause() { super.onPause(); ... if (mSwipeRefreshLayout!=null) { mSwipeRefreshLayout.setRefreshing(false); mSwipeRefreshLayout.destroyDrawingCache(); mSwipeRefreshLayout.clearAnimation(); } }
quelle
support-v4:22.1.1
. Ich hatte dieses Problem, als ich zum Aktualisieren und Schieben des Menüs mit dem Wischen verwendet habe. Ich habe versucht, beim Aufrufen der Fragmenttransaktion false festzulegen, aber das hat nicht funktioniert. Danke für die Lösung.com.android.support:appcompat-v7:24.2.1
setRefreshing(false)
während FragmentTransaction. Nach dem HinzufügenclearAnimation()
funktioniert meine App ohne Einfrieren.Dieses Problem scheint in AppCompat 22.1.1 immer noch aufzutreten. Das Einwickeln des SwipeRefreshLayout in ein FrameLayout hat dies für mich gelöst
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/contentView" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/tweet_list" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/grey_300" /> </android.support.v4.widget.SwipeRefreshLayout> </FrameLayout>
quelle
Zusätzlich zur Antwort von @ zlm2012 habe ich festgestellt, dass dieses Problem unter Support Library 21.0.0 reproduziert wurde, aber derzeit um 21.0.3 behoben zu sein scheint
quelle
compile 'com.android.support:appcompat-v7:25.1.0'
Die Lösung funktioniert, aber ich denke, es ist besser, diese Zeilen in eine eigene Funktion zu setzen, wie zum Beispiel:
public void terminateRefreshing() { mSwipeRefreshLayout.setRefreshing(false); mSwipeRefreshLayout.destroyDrawingCache(); mSwipeRefreshLayout.clearAnimation(); }
und beim Wechseln des Fragments aufrufen.
Fragment prevFrag = fragmentManager.findFragmentById(drawerContainerId); if(prevFrag instanceof SwipeRefreshFragment) { ((SwipeRefreshFragment)prevFrag).terminateRefreshing(); } fragmentManager.beginTransaction().replace(drawerContainerId, fragment).commit();
quelle
Es klappt! Entfernen Sie einfach den Übergang von Ihrem Fragmentersatz. In meinem Fall habe ich Folgendes aus meinem Code entfernt:
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
quelle
Im
clickable="true"
obersten übergeordneten Layout festlegen ... Möglicherweise wird das Problem behoben.quelle
Vorerst können Sie das Problem vermeiden, indem Sie:
public class FixedRefreshLayout extends SwipeRefreshLayout { private static final String TAG = "RefreshTag"; private boolean selfCancelled = false; public FixedRefreshLayout(Context context) { super(context); } public FixedRefreshLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected Parcelable onSaveInstanceState() { if(isRefreshing()) { clearAnimation(); setRefreshing(false); selfCancelled = true; Log.d(TAG, "For hide refreshing"); } return super.onSaveInstanceState(); } @Override public void setRefreshing(boolean refreshing) { super.setRefreshing(refreshing); selfCancelled = false; } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); if(hasWindowFocus && selfCancelled) { setRefreshing(true); Log.d(TAG, "Force show refreshing"); } } }
Dies hat den zusätzlichen Vorteil, dass die Animation fortgesetzt wird, falls Sie das Fragment nicht wechseln möchten (aus einem Menü). Es wird auch mit der internen Animation verknüpft, um sicherzustellen, dass die Aktualisierungsanimation nicht zurückgegeben wird, wenn die Netzwerkaktualisierung bereits abgeschlossen ist.
quelle
Beenden Sie SwipeRefresh, wenn Sie auf das Navigationsmenüelement klicken. Es funktionierte.
private void selectItem(int position) { mSwipeRefreshLayout.setRefreshing(false); /* Other part of the function */ }
quelle