From ec805653bbe7269e08edef6f8b3f473f55153aad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=8E=89=E4=B9=85?= <1484288157@qq.com> Date: Mon, 31 Aug 2020 18:31:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E8=87=B4=E5=AE=8C=E6=88=90=20?= =?UTF-8?q?=E6=95=B4=E7=90=86=20Fragment=20=E5=AE=9E=E4=BE=8B=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20https://gitlab.ghzs.com/halo/assistant-and?= =?UTF-8?q?roid/-/issues/20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/base/BaseActivity_TabLayout.java | 27 +++++-- .../base/fragment/BaseFragment_TabLayout.java | 34 +++++--- .../gh/base/fragment/BaseLazyTabFragment.kt | 25 ++++-- .../com/gh/gamecenter/NormalActivity.java | 11 ++- .../java/com/gh/gamecenter/SearchActivity.kt | 20 +++-- .../com/gh/gamecenter/amway/AmwayActivity.kt | 5 +- .../amway/search/AmwaySearchActivity.kt | 4 +- .../gamecenter/discover/DiscoverFragment.kt | 1 + .../forum/detail/ForumDetailActivity.kt | 5 +- .../fragment/SearchToolWrapperFragment.java | 9 ++- .../personalhome/FollowersOrFansFragment.kt | 2 +- .../personalhome/UserHomeFragment.kt | 12 ++- .../personalhome/home/UserHistoryFragment.kt | 21 ++++- .../home/UserVideoHistoryFragment.kt | 19 ++++- .../detail/AnswerDetailContainerFragment.kt | 27 ++++--- .../AnswerDetailFragmentStatePagerAdapter.kt | 4 +- .../qa/article/edit/ArticleEditActivity.kt | 1 - .../gamecenter/qa/comment/CommentActivity.kt | 57 +++++++------ .../qa/comment/NewCommentFragment.kt | 79 +++++++++++++------ .../gh/gamecenter/qa/select/OpenedFragment.kt | 2 +- .../servers/GameServersPublishFragment.kt | 5 +- .../gh/gamecenter/subject/SubjectActivity.kt | 21 ++++- .../subject/tab/SubjectTabFragment.kt | 19 +++-- .../video/data/VideoDataActivity.kt | 5 +- .../video/game/GameVideoActivity.kt | 10 ++- .../video/poster/PosterClipActivity.kt | 5 +- 26 files changed, 294 insertions(+), 136 deletions(-) diff --git a/app/src/main/java/com/gh/base/BaseActivity_TabLayout.java b/app/src/main/java/com/gh/base/BaseActivity_TabLayout.java index a25ac48a94..95e6ed614d 100644 --- a/app/src/main/java/com/gh/base/BaseActivity_TabLayout.java +++ b/app/src/main/java/com/gh/base/BaseActivity_TabLayout.java @@ -4,10 +4,6 @@ import android.content.Intent; import android.os.Bundle; import android.view.View; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import androidx.viewpager.widget.ViewPager; - import com.gh.base.adapter.FragmentAdapter; import com.gh.base.fragment.BaseFragment_TabLayout; import com.gh.common.view.TabIndicatorView; @@ -18,6 +14,9 @@ import com.lightgame.view.NoScrollableViewPager; import java.util.ArrayList; import java.util.List; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import butterknife.BindView; /** @@ -73,10 +72,12 @@ public abstract class BaseActivity_TabLayout extends ToolBarActivity implements public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getIntent() != null) mCheckedIndex = getIntent().getIntExtra(PAGE_INDEX, 0); - mFragmentsList = new ArrayList<>(); - initFragmentList(mFragmentsList); mTabTitleList = new ArrayList<>(); initTabTitleList(mTabTitleList); + mFragmentsList = new ArrayList<>(restoreFragment()); + if (mFragmentsList.isEmpty() || mFragmentsList.size() != mTabTitleList.size()) { + initFragmentList(mFragmentsList); + } mViewPager.setOffscreenPageLimit(mFragmentsList.size()); mViewPager.addOnPageChangeListener(this); @@ -100,6 +101,20 @@ public abstract class BaseActivity_TabLayout extends ToolBarActivity implements BaseFragment_TabLayout.initTabStyle(mTabLayout, mCheckedIndex); } + private ArrayList restoreFragment() { + String tag = "android:switcher:" + mViewPager.getId() + ":"; + ArrayList fragments = new ArrayList<>(); + int childCount = mTabTitleList.size(); + for (int index = 0; index < childCount; index++) { + Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag + index); + if (fragment != null) { + fragments.add(fragment); + } + } + + return fragments; + } + @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { diff --git a/app/src/main/java/com/gh/base/fragment/BaseFragment_TabLayout.java b/app/src/main/java/com/gh/base/fragment/BaseFragment_TabLayout.java index 51de1bd0e3..37cdca30da 100644 --- a/app/src/main/java/com/gh/base/fragment/BaseFragment_TabLayout.java +++ b/app/src/main/java/com/gh/base/fragment/BaseFragment_TabLayout.java @@ -3,15 +3,6 @@ package com.gh.base.fragment; import android.content.Intent; import android.graphics.Typeface; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.android.material.tabs.TabLayout; - -import androidx.fragment.app.Fragment; -import androidx.viewpager.widget.ViewPager; - import android.view.LayoutInflater; import android.view.View; import android.widget.CheckedTextView; @@ -21,6 +12,7 @@ import com.gh.base.adapter.FragmentAdapter; import com.gh.common.view.TabIndicatorView; import com.gh.gamecenter.R; import com.gh.gamecenter.normal.NormalFragment; +import com.google.android.material.tabs.TabLayout; import com.halo.assistant.HaloApp; import com.lightgame.utils.Utils; import com.lightgame.view.NoScrollableViewPager; @@ -28,6 +20,10 @@ import com.lightgame.view.NoScrollableViewPager; import java.util.ArrayList; import java.util.List; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import butterknife.BindView; /** @@ -83,10 +79,26 @@ public abstract class BaseFragment_TabLayout extends NormalFragment implements V public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) mCheckedIndex = getArguments().getInt(PAGE_INDEX, 0); - mFragmentsList = new ArrayList<>(); - initFragmentList(mFragmentsList); mTabTitleList = new ArrayList<>(); initTabTitleList(mTabTitleList); + mFragmentsList = new ArrayList<>(restoreFragment()); + if (mFragmentsList.isEmpty() || mFragmentsList.size() != mTabTitleList.size()) { + initFragmentList(mFragmentsList); + } + } + + private ArrayList restoreFragment() { + String tag = "android:switcher:" + mViewPager.getId() + ":"; + ArrayList fragments = new ArrayList<>(); + int childCount = mTabTitleList.size(); + for (int index = 0; index < childCount; index++) { + Fragment fragment = getChildFragmentManager().findFragmentByTag(tag + index); + if (fragment != null) { + fragments.add(fragment); + } + } + + return fragments; } @Override diff --git a/app/src/main/java/com/gh/base/fragment/BaseLazyTabFragment.kt b/app/src/main/java/com/gh/base/fragment/BaseLazyTabFragment.kt index 7b2fd0c9a5..44a40ef8c1 100644 --- a/app/src/main/java/com/gh/base/fragment/BaseLazyTabFragment.kt +++ b/app/src/main/java/com/gh/base/fragment/BaseLazyTabFragment.kt @@ -1,10 +1,8 @@ package com.gh.base.fragment import android.content.Intent -import android.graphics.Typeface import android.os.Bundle import android.view.View -import android.widget.TextView import androidx.fragment.app.Fragment import androidx.viewpager.widget.PagerAdapter import androidx.viewpager.widget.ViewPager @@ -13,9 +11,8 @@ import com.gh.base.adapter.FragmentAdapter import com.gh.common.view.TabIndicatorView import com.gh.gamecenter.R import com.google.android.material.tabs.TabLayout -import com.google.android.material.tabs.TabLayout.OnTabSelectedListener -import com.lightgame.utils.Utils import com.lightgame.view.NoScrollableViewPager +import java.util.* abstract class BaseLazyTabFragment : BaseLazyFragment(), ViewPager.OnPageChangeListener { @@ -72,9 +69,14 @@ abstract class BaseLazyTabFragment : BaseLazyFragment(), ViewPager.OnPageChangeL override fun onFragmentFirstVisible() { super.onFragmentFirstVisible() + mTabTitleList.clear() + mFragmentsList.clear() - initFragmentList(mFragmentsList) initTabTitleList(mTabTitleList) + mFragmentsList.addAll(restoreFragment()) + if (mFragmentsList.isEmpty() || mFragmentsList.size != mTabTitleList.size) { + initFragmentList(mFragmentsList) + } mViewPager.offscreenPageLimit = mFragmentsList.size mViewPager.addOnPageChangeListener(this) @@ -95,6 +97,19 @@ abstract class BaseLazyTabFragment : BaseLazyFragment(), ViewPager.OnPageChangeL BaseFragment_TabLayout.initTabStyle(mTabLayout, mCheckedIndex) } + private fun restoreFragment(): ArrayList { + val tag = "android:switcher:${mViewPager.id}:" + val fragments = ArrayList() + val childCount = mTabTitleList.size + for (index in 0 until childCount) { + val fragment = childFragmentManager.findFragmentByTag("$tag$index") + if (fragment != null) { + fragments.add(fragment) + } + } + return fragments + } + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} override fun onPageSelected(position: Int) {} diff --git a/app/src/main/java/com/gh/gamecenter/NormalActivity.java b/app/src/main/java/com/gh/gamecenter/NormalActivity.java index c5508caefe..3c00fb4d0b 100644 --- a/app/src/main/java/com/gh/gamecenter/NormalActivity.java +++ b/app/src/main/java/com/gh/gamecenter/NormalActivity.java @@ -7,11 +7,11 @@ import android.text.TextUtils; import android.view.MenuItem; import android.view.MotionEvent; -import androidx.fragment.app.Fragment; - import com.gh.base.ToolBarActivity; import com.gh.gamecenter.normal.NormalFragment; +import androidx.fragment.app.Fragment; + /** * Created by khy on 17/10/17. */ @@ -94,8 +94,11 @@ public abstract class NormalActivity extends ToolBarActivity { if (bundle == null) bundle = getIntent().getExtras(); if (TextUtils.isEmpty(fraName)) return; } - mTargetFragment = Fragment.instantiate(this, fraName, bundle); - getSupportFragmentManager().beginTransaction().replace(getFragmentPlaceholderId(), mTargetFragment).commitNowAllowingStateLoss(); + mTargetFragment = getSupportFragmentManager().findFragmentByTag(fraName); + if (mTargetFragment == null) { + mTargetFragment = Fragment.instantiate(this, fraName, bundle); + } + getSupportFragmentManager().beginTransaction().replace(getFragmentPlaceholderId(), mTargetFragment, fraName).commitNowAllowingStateLoss(); } @Override diff --git a/app/src/main/java/com/gh/gamecenter/SearchActivity.kt b/app/src/main/java/com/gh/gamecenter/SearchActivity.kt index f2e749853a..241999294d 100644 --- a/app/src/main/java/com/gh/gamecenter/SearchActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/SearchActivity.kt @@ -182,18 +182,22 @@ open class SearchActivity : BaseActivity() { open fun updateDisplayType(type: DisplayType) { val transaction = supportFragmentManager.beginTransaction() when (type) { - DisplayType.DEFAULT -> { - transaction.replace(R.id.search_result, SearchDefaultFragment(), SearchDefaultFragment::class.java.simpleName) + DEFAULT -> { + val fragment = supportFragmentManager.findFragmentByTag(SearchDefaultFragment::class.java.simpleName) + ?: SearchDefaultFragment() + transaction.replace(R.id.search_result, fragment, SearchDefaultFragment::class.java.simpleName) } - DisplayType.GAME_DIGEST -> { - val digestListFragment = SearchGameIndexFragment() + GAME_DIGEST -> { + val digestListFragment = supportFragmentManager.findFragmentByTag(SearchGameIndexFragment::class.java.simpleName) as? SearchGameIndexFragment + ?: SearchGameIndexFragment() digestListFragment.setParams(mSearchKey ?: "", mSearchType.value) - transaction.replace(R.id.search_result, digestListFragment) + transaction.replace(R.id.search_result, digestListFragment, SearchGameIndexFragment::class.java.simpleName) } - DisplayType.GAME_DETAIL -> { - val detailListFragment = SearchGameResultFragment() + GAME_DETAIL -> { + val detailListFragment = supportFragmentManager.findFragmentByTag(SearchGameResultFragment::class.java.simpleName) as? SearchGameResultFragment + ?: SearchGameResultFragment() detailListFragment.setParams(mSearchKey ?: "", mSearchType.value) - transaction.replace(R.id.search_result, detailListFragment) + transaction.replace(R.id.search_result, detailListFragment, SearchGameResultFragment::class.java.simpleName) } } mDisplayType = type diff --git a/app/src/main/java/com/gh/gamecenter/amway/AmwayActivity.kt b/app/src/main/java/com/gh/gamecenter/amway/AmwayActivity.kt index 4f8e434a14..0bdd6f1f95 100644 --- a/app/src/main/java/com/gh/gamecenter/amway/AmwayActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/amway/AmwayActivity.kt @@ -19,9 +19,10 @@ class AmwayActivity : BaseActivity() { DisplayUtils.transparentStatusBar(this) - val containerFragment = AmwayFragment().with(intent.extras) + val containerFragment = supportFragmentManager.findFragmentByTag(AmwayFragment::class.java.simpleName) + ?: AmwayFragment().with(intent.extras) // 若 placeholder 外层为 RelativeLayout 的话,会出现莫名的偏移 - supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment).commitAllowingStateLoss() + supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment, AmwayFragment::class.java.simpleName).commitAllowingStateLoss() } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/amway/search/AmwaySearchActivity.kt b/app/src/main/java/com/gh/gamecenter/amway/search/AmwaySearchActivity.kt index 6941bd3534..3a46fb5b6a 100644 --- a/app/src/main/java/com/gh/gamecenter/amway/search/AmwaySearchActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/amway/search/AmwaySearchActivity.kt @@ -63,7 +63,9 @@ class AmwaySearchActivity : SearchActivity() { val transaction = supportFragmentManager.beginTransaction() when (type) { DisplayType.DEFAULT -> { - transaction.replace(R.id.search_result, AmwaySearchDefaultFragment(), SearchDefaultFragment::class.java.simpleName) + val fragment = supportFragmentManager.findFragmentByTag(AmwaySearchDefaultFragment::class.java.simpleName) + ?: AmwaySearchDefaultFragment() + transaction.replace(R.id.search_result, fragment, SearchDefaultFragment::class.java.simpleName) } else -> { val fragment = supportFragmentManager.findFragmentByTag(AmwaySearchListFragment::class.java.simpleName) diff --git a/app/src/main/java/com/gh/gamecenter/discover/DiscoverFragment.kt b/app/src/main/java/com/gh/gamecenter/discover/DiscoverFragment.kt index 4e3f455cf8..cb36128d1f 100644 --- a/app/src/main/java/com/gh/gamecenter/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/discover/DiscoverFragment.kt @@ -26,6 +26,7 @@ import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +@Deprecated("废弃") class DiscoverFragment : BaseFragment() { @BindView(R.id.discover_game_unread) diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt index e6c4cd9311..5c168aa7b6 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt @@ -19,9 +19,10 @@ class ForumDetailActivity : BaseActivity() { DisplayUtils.transparentStatusBar(this) - val containerFragment = ForumDetailFragment().with(intent.extras) + val containerFragment = supportFragmentManager.findFragmentByTag(ForumDetailFragment::class.java.simpleName) + ?: ForumDetailFragment().with(intent.extras) // 若 placeholder 外层为 RelativeLayout 的话,会出现莫名的偏移 - supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment).commitAllowingStateLoss() + supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment, ForumDetailFragment::class.java.simpleName).commitAllowingStateLoss() } companion object { diff --git a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java index 0b1ff1fd36..3df6d55dc9 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java @@ -38,7 +38,8 @@ public class SearchToolWrapperFragment extends BaseLazyFragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mSearchToolbarFragment = new SearchToolbarFragment(); + mSearchToolbarFragment = (SearchToolbarFragment) getChildFragmentManager().findFragmentByTag(SearchToolbarFragment.class.getSimpleName()); + if (mSearchToolbarFragment == null) mSearchToolbarFragment = new SearchToolbarFragment(); try { Bundle arguments = getArguments(); if (arguments != null) { @@ -47,13 +48,15 @@ public class SearchToolWrapperFragment extends BaseLazyFragment { wrapperLl.setPadding(0, 0, 0, DisplayUtils.dip2px(54)); } String className = Objects.requireNonNull(arguments.getString(WRAPPER_FRAGMENT_NAME)); - mContentFragment = (Fragment) Class.forName(className).newInstance(); + mContentFragment = getChildFragmentManager().findFragmentByTag(className); + if (mContentFragment == null) + mContentFragment = (Fragment) Class.forName(className).newInstance(); } } catch (Exception e) { e.printStackTrace(); } getChildFragmentManager().beginTransaction() - .replace(R.id.wrapper_toolbar, mSearchToolbarFragment) + .replace(R.id.wrapper_toolbar, mSearchToolbarFragment, SearchToolbarFragment.class.getSimpleName()) .replace(R.id.wrapper_main_content, Objects.requireNonNull(mContentFragment)).commitAllowingStateLoss(); } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt index 0ebc946264..51b3475b01 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt @@ -24,7 +24,7 @@ class FollowersOrFansFragment : ListFragment + var fragment = childFragmentManager.findFragmentByTag("${tag}${position}") as? AnswerDetailFragment + if (fragment == null) { + fragment = AnswerDetailFragment().apply { + if (mHasPassedOneTimeArgumentToChild) { + this@AnswerDetailContainerFragment.arguments?.putBoolean(EntranceUtils.KEY_SHOW_ANSWER_COMMENT, false) + this@AnswerDetailContainerFragment.arguments?.putBoolean(EntranceUtils.KEY_RECOMMENDS_CONTENTS, false) + } - mFragmentAdapter = AnswerDetailFragmentStatePagerAdapter(fragmentManager!!) { - AnswerDetailFragment().apply { - if (mHasPassedOneTimeArgumentToChild) { - this@AnswerDetailContainerFragment.arguments?.putBoolean(EntranceUtils.KEY_SHOW_ANSWER_COMMENT, false) - this@AnswerDetailContainerFragment.arguments?.putBoolean(EntranceUtils.KEY_RECOMMENDS_CONTENTS, false) + // 将外部的 argument 传给里面的 fragment + this.arguments = this@AnswerDetailContainerFragment.arguments + this.arguments?.putString(EntranceUtils.KEY_ANSWER_ID, id) + mHasPassedOneTimeArgumentToChild = true + fragments.add(this) } - - // 将外部的 argument 传给里面的 fragment - this.arguments = this@AnswerDetailContainerFragment.arguments - this.arguments?.putString(EntranceUtils.KEY_ANSWER_ID, it) - mHasPassedOneTimeArgumentToChild = true - fragments.add(this) } + fragment } mFragmentAdapter.answerIdList = ArrayList(mContainerViewModel.answerIdList) diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragmentStatePagerAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragmentStatePagerAdapter.kt index a593ab4f64..846ae189cf 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragmentStatePagerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragmentStatePagerAdapter.kt @@ -5,13 +5,13 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter class AnswerDetailFragmentStatePagerAdapter(fm: FragmentManager, - private val mCreateNewAnswerDetailFragment: (answerId: String) -> AnswerDetailFragment) + private val mCreateNewAnswerDetailFragment: (answerId: String, position: Int) -> AnswerDetailFragment) : androidx.fragment.app.FragmentStatePagerAdapter(fm) { var answerIdList = arrayListOf() override fun getItem(position: Int): androidx.fragment.app.Fragment { - return mCreateNewAnswerDetailFragment.invoke(answerIdList[position]) + return mCreateNewAnswerDetailFragment.invoke(answerIdList[position], position) } override fun getCount(): Int { diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt index 05ea0fb7c6..34cc29f340 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt @@ -184,7 +184,6 @@ class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { }) mViewModel.titleTags.observe(this, Observer> { - it if (supportFragmentManager.findFragmentByTag(TagsSelectFragment::javaClass.name) == null) { val dialog = BaseDialogWrapperFragment.getInstance(ArticleTagsSelectFragment.getInstance(), false) dialog.show(supportFragmentManager, TagsSelectFragment::javaClass.name) diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt index 7e52f6d915..beff7eb0ae 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt @@ -12,6 +12,7 @@ import com.gh.common.util.doOnEnd import com.gh.gamecenter.R import com.gh.gamecenter.entity.CommentEntity import com.gh.gamecenter.qa.answer.detail.AnswerDetailFragment +import com.gh.gamecenter.search.SearchDefaultFragment import com.lightgame.utils.Util_System_Keyboard import kotlinx.android.synthetic.main.activity_comment.* @@ -53,34 +54,40 @@ class CommentActivity : BaseActivity() { setResult(Activity.RESULT_OK, resultIntent) } } - - val commentFragment = if (!answerId.isNullOrEmpty()) { - NewCommentFragment.getAnswerCommentInstance( - answerId, - showKeyboard, - commentCount, - commentCallback) - } else if (!articleId.isNullOrEmpty()) { - NewCommentFragment.getCommunityArticleCommentInstance( - articleId, - communityId, - showKeyboard, - commentCount, - mShowInputOnly, - useReplyApi, - commentEntity, - commentCallback) + var commentFragment = supportFragmentManager.findFragmentByTag(NewCommentFragment::class.java.simpleName) + if (commentFragment != null) { + if (commentFragment is NewCommentFragment) { + commentFragment.setCommentListener(commentCallback) + } } else { - NewCommentFragment.getVideoCommentInstance( - videoId, - showKeyboard, - commentCount, - isVideoAuthor, - commentEntity, - commentCallback) + commentFragment = if (!answerId.isNullOrEmpty()) { + NewCommentFragment.getAnswerCommentInstance( + answerId, + showKeyboard, + commentCount, + commentCallback) + } else if (!articleId.isNullOrEmpty()) { + NewCommentFragment.getCommunityArticleCommentInstance( + articleId, + communityId, + showKeyboard, + commentCount, + mShowInputOnly, + useReplyApi, + commentEntity, + commentCallback) + } else { + NewCommentFragment.getVideoCommentInstance( + videoId, + showKeyboard, + commentCount, + isVideoAuthor, + commentEntity, + commentCallback) + } } - supportFragmentManager.beginTransaction().replace(R.id.answerCommentPlaceholderView, commentFragment).commitNowAllowingStateLoss() + supportFragmentManager.beginTransaction().replace(R.id.answerCommentPlaceholderView, commentFragment, NewCommentFragment::class.java.simpleName).commitNowAllowingStateLoss() maskView.alpha = 0f if (videoId.isNullOrEmpty()) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt index cb35351181..8c6e91b05e 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt @@ -11,6 +11,7 @@ import android.view.inputmethod.InputMethodManager import android.widget.* import androidx.annotation.Nullable import androidx.core.content.ContextCompat +import androidx.core.os.bundleOf import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView import butterknife.BindView @@ -94,6 +95,19 @@ open class NewCommentFragment : ListFragment var mCommentListener: AnswerDetailFragment.CommentListener? = null override fun onCreate(savedInstanceState: Bundle?) { + arguments?.apply { + mShowSoftKeyboardOnStartUp = getBoolean(SHOW_SOFT_KEY_BOARD_ON_STARTUP, false) + mAnswerId = getString(ANSWER_ID, "") + mArticleId = getString(ARTICLE_ID, "") + mVideoId = getString(VIDEO_ID, "") + mCommentCount = getInt(COMMENT_COUNT, 0) + mCommentType = getSerializable(COMMENT_TYPE) as CommentType + mCommunityId = getString(COMMUNITY_ID, "") + mShowInputOnly = getBoolean(SHOW_INPUT_ONLY, false) + mCommentEntity = getParcelable(COMMENT_ENTITY) + mIsVideoAuthor = getBoolean(IS_VIDEO_AUTHOR, false) + } + super.onCreate(savedInstanceState) mViewModel.postCommentLiveData.observe(this, Observer { apiResponse -> @@ -236,6 +250,10 @@ open class NewCommentFragment : ListFragment view.post { mKeyboardHeightProvider?.start() } } + fun setCommentListener(listener: AnswerDetailFragment.CommentListener) { + mCommentListener = listener + } + override fun onResume() { super.onResume() mKeyboardHeightProvider?.setKeyboardHeightObserver(this) @@ -503,18 +521,30 @@ open class NewCommentFragment : ListFragment const val COMMENT_PAUSE = "comment_pause" const val COMMENT_RESUME = "comment_resume" - // TODO 改成 argument 形式的入参 + const val SHOW_SOFT_KEY_BOARD_ON_STARTUP = "showSoftKeyboardOnStartUp" + const val ANSWER_ID = "answerId" + const val ARTICLE_ID = "articleId" + const val VIDEO_ID = "videoId" + const val COMMENT_COUNT = "commentCount" + const val COMMENT_TYPE = "commentType" + const val COMMUNITY_ID = "communityId" + const val SHOW_INPUT_ONLY = "showInputOnly" + const val COMMENT_ENTITY = "commentEntity" + const val IS_VIDEO_AUTHOR = "isVideoAuthor" + fun getAnswerCommentInstance(answerId: String, showSoftKeyboardOnStartUp: Boolean, commentCount: Int, listener: AnswerDetailFragment.CommentListener) : NewCommentFragment { return NewCommentFragment().apply { - mShowSoftKeyboardOnStartUp = showSoftKeyboardOnStartUp - mAnswerId = answerId - mCommentCount = commentCount mCommentListener = listener - mCommentType = CommentType.ANSWER + with(bundleOf( + SHOW_SOFT_KEY_BOARD_ON_STARTUP to showSoftKeyboardOnStartUp, + ANSWER_ID to answerId, + COMMENT_COUNT to commentCount, + COMMENT_TYPE to CommentType.ANSWER + )) } } @@ -527,19 +557,22 @@ open class NewCommentFragment : ListFragment commentEntity: CommentEntity?, listener: AnswerDetailFragment.CommentListener) : NewCommentFragment { + val commentType = if (useReplyApi) { + CommentType.COMMUNITY_ARTICLE_CONVERSATION + } else { + CommentType.COMMUNITY_ARTICLE + } return NewCommentFragment().apply { - mShowSoftKeyboardOnStartUp = showSoftKeyboardOnStartUp - mArticleId = articleId - mCommentCount = commentCount mCommentListener = listener - mCommunityId = communityId - mShowInputOnly = showInputOnly - mCommentEntity = commentEntity - mCommentType = if (useReplyApi) { - CommentType.COMMUNITY_ARTICLE_CONVERSATION - } else { - CommentType.COMMUNITY_ARTICLE - } + with(bundleOf( + SHOW_SOFT_KEY_BOARD_ON_STARTUP to showSoftKeyboardOnStartUp, + ARTICLE_ID to articleId, + COMMENT_COUNT to commentCount, + COMMENT_TYPE to commentType, + COMMUNITY_ID to communityId, + SHOW_INPUT_ONLY to showInputOnly, + COMMENT_ENTITY to commentEntity + )) } } @@ -551,13 +584,15 @@ open class NewCommentFragment : ListFragment listener: AnswerDetailFragment.CommentListener) : StairsCommentFragment { return StairsCommentFragment().apply { - mVideoId = videoId - mCommentCount = commentCount mCommentListener = listener - mShowSoftKeyboardOnStartUp = showSoftKeyboardOnStartUp - mIsVideoAuthor = isVideoAuthor - mCommentType = CommentType.VIDEO - mCommentEntity = commentEntity + with(bundleOf( + SHOW_SOFT_KEY_BOARD_ON_STARTUP to showSoftKeyboardOnStartUp, + VIDEO_ID to videoId, + COMMENT_COUNT to commentCount, + COMMENT_TYPE to CommentType.VIDEO, + COMMENT_ENTITY to commentEntity, + IS_VIDEO_AUTHOR to isVideoAuthor + )) } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/select/OpenedFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/select/OpenedFragment.kt index e0cdf75f15..9390f2ae74 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/select/OpenedFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/select/OpenedFragment.kt @@ -21,7 +21,7 @@ class OpenedFragment : ListFragment() override fun provideListAdapter(): OpenedAdapter { if (mAdapter == null) { - mAdapter = OpenedAdapter(context!!, mListViewModel) + mAdapter = OpenedAdapter(requireContext(), mListViewModel) } return mAdapter!! } diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersPublishFragment.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersPublishFragment.kt index c801d3cf66..7a15ba0165 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersPublishFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersPublishFragment.kt @@ -66,9 +66,10 @@ class GameServersPublishFragment : BaseFragment() { val bundle = Bundle() bundle.putString(EntranceUtils.KEY_TYPE, "开服") - mContentFragment = GameServersContentFragment() + mContentFragment = childFragmentManager.findFragmentByTag(GameServersContentFragment::class.java.simpleName) as? GameServersContentFragment + ?: GameServersContentFragment() mContentFragment.arguments = bundle - childFragmentManager.beginTransaction().replace(R.id.layout_fragment_content, mContentFragment).commitAllowingStateLoss() + childFragmentManager.beginTransaction().replace(R.id.layout_fragment_content, mContentFragment, GameServersContentFragment::class.java.simpleName).commitAllowingStateLoss() loadServerFilterTag() } diff --git a/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt b/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt index d49e170810..d5c48d8dc8 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt @@ -63,16 +63,29 @@ class SubjectActivity : ToolBarActivity() { private fun initContentView(entity: SubjectSettingEntity) { val transaction = supportFragmentManager.beginTransaction() + var tag: String val fragment: Fragment = when { - "tile" == entity.typeEntity.layout -> SubjectTileFragment() - "rows" == entity.typeEntity.layout -> SubjectRowsFragment() - else -> SubjectTabFragment() + "tile" == entity.typeEntity.layout -> { + tag = SubjectTileFragment::class.java.simpleName + supportFragmentManager.findFragmentByTag(tag) + ?: SubjectTileFragment() + } + "rows" == entity.typeEntity.layout -> { + tag = SubjectRowsFragment::class.java.simpleName + supportFragmentManager.findFragmentByTag(tag) + ?: SubjectRowsFragment() + } + else -> { + tag = SubjectTabFragment::class.java.simpleName + supportFragmentManager.findFragmentByTag(tag) + ?: SubjectTabFragment() + } } val bundle = intent.extras bundle?.putParcelable(EntranceUtils.KEY_SUBJECT_DATA, mViewModel?.subjectData) bundle?.putParcelable(SubjectSettingEntity::class.java.simpleName, entity) fragment.arguments = bundle - transaction.replace(R.id.subject_content, fragment) + transaction.replace(R.id.subject_content, fragment, tag) transaction.commitAllowingStateLoss() } diff --git a/app/src/main/java/com/gh/gamecenter/subject/tab/SubjectTabFragment.kt b/app/src/main/java/com/gh/gamecenter/subject/tab/SubjectTabFragment.kt index 16bae37dc3..52eeb9b26f 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/tab/SubjectTabFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/subject/tab/SubjectTabFragment.kt @@ -20,7 +20,8 @@ import kotterknife.bindView class SubjectTabFragment : BaseFragment() { private val mTabContainer by bindView(R.id.subject_tab_container) -// private val mTabLine by bindView(R.id.subject_tab_line) + + // private val mTabLine by bindView(R.id.subject_tab_line) private val mTabLayout by bindView(R.id.subject_tab) private val mViewPager by bindView(R.id.subject_viewpager) private val mTabIndicatorView by bindView(R.id.subject_tab_indicator) @@ -34,6 +35,7 @@ class SubjectTabFragment : BaseFragment() { val mSubjectList = arguments?.getParcelableArrayList(EntranceUtils.KEY_DATA) val fragments = ArrayList() var tagList = arrayListOf() + val fragmentTag = "android:switcher:${mViewPager.id}:" if (mSubjectList.isNullOrEmpty()) { // 专题详情 val subjectData = arguments?.getParcelable(EntranceUtils.KEY_SUBJECT_DATA) @@ -45,9 +47,9 @@ class SubjectTabFragment : BaseFragment() { mTabContainer.visibility = View.VISIBLE // mTabLine.visibility = View.VISIBLE } - - for (tag in tagList) { - val element = SubjectListFragment() + tagList.forEachIndexed { index, tag -> + val element = childFragmentManager.findFragmentByTag("${fragmentTag}$index") + ?: SubjectListFragment() val bundle = arguments?.clone() as Bundle? val copyData = subjectData.deepCopy() copyData.filter = UrlFilterUtils.getFilterQuery("type", tag) @@ -60,14 +62,15 @@ class SubjectTabFragment : BaseFragment() { mTabContainer.visibility = View.VISIBLE // mTabLine.visibility = View.VISIBLE - for (data in mSubjectList) { - val element = SubjectListFragment() + mSubjectList.filterIndexed { index, subjectData -> + val element = childFragmentManager.findFragmentByTag("${fragmentTag}$index") + ?: SubjectListFragment() val bundle = arguments?.clone() as Bundle? - bundle?.putParcelable(EntranceUtils.KEY_SUBJECT_DATA, data) + bundle?.putParcelable(EntranceUtils.KEY_SUBJECT_DATA, subjectData) element.arguments = bundle fragments.add(element) - tagList.add(data.subjectName ?: "") + tagList.add(subjectData.subjectName ?: "") } mViewPager.post { diff --git a/app/src/main/java/com/gh/gamecenter/video/data/VideoDataActivity.kt b/app/src/main/java/com/gh/gamecenter/video/data/VideoDataActivity.kt index 0e1ccd59cb..9a198197a8 100644 --- a/app/src/main/java/com/gh/gamecenter/video/data/VideoDataActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/data/VideoDataActivity.kt @@ -15,9 +15,10 @@ class VideoDataActivity : BaseActivity() { DisplayUtils.transparentStatusBar(this) - val containerFragment = VideoDataFragment().with(intent.extras) + val containerFragment = supportFragmentManager.findFragmentByTag(VideoDataFragment::class.java.simpleName) + ?: VideoDataFragment().with(intent.extras) // 若 placeholder 外层为 RelativeLayout 的话,会出现莫名的偏移 - supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment).commitAllowingStateLoss() + supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment, VideoDataFragment::class.java.simpleName).commitAllowingStateLoss() } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/game/GameVideoActivity.kt b/app/src/main/java/com/gh/gamecenter/video/game/GameVideoActivity.kt index 9363532e9c..8e8e99eadb 100644 --- a/app/src/main/java/com/gh/gamecenter/video/game/GameVideoActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/game/GameVideoActivity.kt @@ -32,20 +32,22 @@ class GameVideoActivity : ToolBarActivity() { setNavigationTitle("视频合集") setStatusBarColor(R.color.text_181927.toColor()) mTitleTv.setTextColor(Color.WHITE) + mBinding = DataBindingUtil.bind(mContentView)!! // viewpager & tab content val gameId = intent.getStringExtra(EntranceUtils.KEY_GAMEID) val titles = arrayListOf("最热", "最新") val fragments = ArrayList() - val hottest = GameVideoFragment() + val tag = "android:switcher:${mBinding.viewpager.id}:" + val hottest = supportFragmentManager.findFragmentByTag("${tag}0") ?: GameVideoFragment() val hottestBundle = Bundle() hottestBundle.putString(EntranceUtils.KEY_GAMEID, gameId) hottestBundle.putString(EntranceUtils.KEY_SORT, "vote_recently:-1") hottest.arguments = hottestBundle fragments.add(hottest) - val newest = GameVideoFragment() + val newest = supportFragmentManager.findFragmentByTag("${tag}1") ?: GameVideoFragment() val newestBundle = Bundle() newestBundle.putString(EntranceUtils.KEY_GAMEID, gameId) newestBundle.putString(EntranceUtils.KEY_SORT, "time.upload:-1") @@ -53,7 +55,6 @@ class GameVideoActivity : ToolBarActivity() { fragments.add(newest) // view - mBinding = DataBindingUtil.bind(mContentView)!! mBinding.viewpager.offscreenPageLimit = fragments.size mBinding.viewpager.adapter = FragmentAdapter(supportFragmentManager, fragments, titles) mBinding.tabLayout.setupWithViewPager(mBinding.viewpager) @@ -66,7 +67,8 @@ class GameVideoActivity : ToolBarActivity() { mViewModel = ViewModelProviders.of(this, factory).get(GameVideoViewModel::class.java) mViewModel.gameViewInfo.observeNonNull(this, callback = { if (it.status == Status.SUCCESS) { - mBinding.gameIcon.displayGameIcon(it.data?.game?.getIcon() ?: it.data?.gameIcon, it.data?.game?.iconSubscript) + mBinding.gameIcon.displayGameIcon(it.data?.game?.getIcon() + ?: it.data?.gameIcon, it.data?.game?.iconSubscript) mBinding.gameName.text = it.data?.gameName mBinding.likeCount.text = NumberUtils.transSimpleCount(it.data?.likeCount ?: 0) mBinding.videoCount.text = NumberUtils.transSimpleCount(it.data?.videoCount ?: 0) diff --git a/app/src/main/java/com/gh/gamecenter/video/poster/PosterClipActivity.kt b/app/src/main/java/com/gh/gamecenter/video/poster/PosterClipActivity.kt index 1fc8650241..8ff86ff7a9 100644 --- a/app/src/main/java/com/gh/gamecenter/video/poster/PosterClipActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/poster/PosterClipActivity.kt @@ -24,10 +24,11 @@ class PosterClipActivity : ToolBarActivity() { setNavigationTitle("剪辑封面") val videoPath = intent.getStringExtra(EntranceUtils.KEY_PATH_VIDEO) - val fragment = VideoPosterFragment.newInstance(videoPath, null) + val fragment = supportFragmentManager.findFragmentByTag(VideoPosterFragment::class.java.simpleName) as? VideoPosterFragment + ?: VideoPosterFragment.newInstance(videoPath, null) supportFragmentManager .beginTransaction() - .replace(R.id.layout_fragment_content, fragment) + .replace(R.id.layout_fragment_content, fragment, VideoPosterFragment::class.java.simpleName) .commitAllowingStateLoss() findViewById(R.id.menu_next).setOnClickListener {