74

更新:正しく機能したと思いました。しかし、いくつかのテストの後、問題はまだ存在します*スニッフ*

次に、より単純なバージョンを作成して正確に何が起こるかを確認したところ、切り離されたはずのさわやかなフラグメントがまだそこに残っていることがわかりました。または正確には、新しいフラグメントの上に古いフラグメントのビューが残っています。私の元のアプリの 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。1 つのことを除いて、すべて問題ないように見えますContentView。ナビゲーション ドロワーによる更新中にフラグメントを切り替えると、コンテンツがフリーズします。しかし、実際には、見えないことを除いて、すべてが通常どおり機能します。

4

8 に答える 8

1

解決策は機能しますが、次のように、これらの行を独自の関数に入れる方がよいと思います。

public void terminateRefreshing() {
    mSwipeRefreshLayout.setRefreshing(false);
    mSwipeRefreshLayout.destroyDrawingCache();
    mSwipeRefreshLayout.clearAnimation();
}

フラグメントを切り替えるときに呼び出します。

Fragment prevFrag = fragmentManager.findFragmentById(drawerContainerId);

if(prevFrag instanceof SwipeRefreshFragment) {
    ((SwipeRefreshFragment)prevFrag).terminateRefreshing();
}

fragmentManager.beginTransaction().replace(drawerContainerId, fragment).commit();
于 2015-06-02T23:17:42.643 に答える
1

できます!フラグメント置換からトランジションを削除するだけです。私の場合、コードから以下を削除しました。

.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
于 2016-07-06T19:40:08.367 に答える
0

当面は、次の方法で問題を回避できます。

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");
        }
    }
}

これには、(一部のメニューからの) フラグメントを切り替えないことにした場合に備えて、アニメーションを再開できるという追加の利点があります。また、内部アニメーションと連携して、ネットワークの更新が既に完了している場合に更新アニメーションが戻らないようにします。

于 2016-02-22T04:32:35.723 に答える
0

ナビゲーション メニュー項目がクリックされるたびに SwipeRefresh を終了します。出来た。

private void selectItem(int position) {

       mSwipeRefreshLayout.setRefreshing(false);

       /*
        Other part of the function
       */
}
于 2016-08-13T13:12:53.013 に答える