1. ホーム
  2. android

更新中にSwipeRefreshLayoutでフラグメントを切り替えると、フラグメントがフリーズするが、実際にはまだ動作している

2023-12-19 10:03:34

質問

UPDATE: 私はそれが正しく動作すると思った。しかし、いくつかのテストの後、トラブルはまだ存在しています*sniff*。

その後、よりシンプルなバージョンを作成し、何が起こるかを確認したところ、切り離されたはずのリフレッシュされたフラグメントがまだ残っていることが分かりました。正確には、古いフラグメントのビューがそこに残っています。 の上に 新しいフラグメントの上に。元のアプリのRecyclerViewの背景は透明ではないので、前に言ったような結果になりました。

アップデートの終了


私は MainActivity で、このようなレイアウトです。

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

フラグメント ContentView を埋めるために使う @id/container は、次のように構成されています。

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

そして、ここでは onCreateView()ContentView

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

次に MainActivity を切り替えることで、表示する内容を変えています。 ContentView . すべてうまくいっているように見えますが、ひとつだけ例外があります。 ContentView フラグメントを切り替えたときに、コンテンツがフリーズしてしまいます。しかし、実際には、あなたがそれを見ることができないことを除いて、すべてのものは通常通り動作します。

どのように解決するのですか?

さて... 苦労の末、結局は自分でこの問題を解決したのですが、トリッキーな方法で...

私はちょうど以下を追加する必要があります onPause() :

@Override
public void onPause() {
    super.onPause();
    ...

    if (mSwipeRefreshLayout!=null) {
        mSwipeRefreshLayout.setRefreshing(false);
        mSwipeRefreshLayout.destroyDrawingCache();
        mSwipeRefreshLayout.clearAnimation();
    }
}