Android 新活动启动后具有TableLayout保存状态的活动
我有一个Android 新活动启动后具有TableLayout保存状态的活动,android,android-fragments,android-viewpager,android-tablayout,start-activity,Android,Android Fragments,Android Viewpager,Android Tablayout,Start Activity,我有一个活动,其中包含一个链接到查看页面的表格布局。ViewPager包含三个片段,每个片段都有一个包含文章列表的RecyclerView。当您单击a列表项时,它将启动一个新的带有全文的活动。启动新的活动,然后按后退按钮返回到第一个活动,它从选择的第一个选项卡开始 我希望能够从任何选项卡启动一个新的活动,然后当按下后退按钮时,它会返回到选择了相同选项卡的上一个活动。最好在回收视图中保持状态(即向下滚动多远)。我怎样才能做到这一点 我已尝试使用onSaveInstanceState保存viewPa
活动
,其中包含一个链接到查看页面
的表格布局
。ViewPager
包含三个片段,每个片段都有一个包含文章列表的RecyclerView
。当您单击a列表项时,它将启动一个新的带有全文的活动
。启动新的活动
,然后按后退按钮返回到第一个活动
,它从选择的第一个选项卡开始
我希望能够从任何选项卡启动一个新的活动
,然后当按下后退按钮时,它会返回到选择了相同选项卡的上一个活动。最好在回收视图
中保持状态(即向下滚动多远)。我怎样才能做到这一点
我已尝试使用onSaveInstanceState
保存viewPager.getCurrentItem()
。它在设备旋转时有效,但在新的活动启动后,似乎不会调用保存的实例状态
选项卡式的活动
:
public class ArticleActivity extends BaseActivity {
@Bind(R.id.toolbar) Toolbar mToolbar;
@Bind(R.id.content) ViewPager mViewPager;
@Bind(R.id.tabs) TabLayout mTabLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_article);
ButterKnife.bind(this);
setupActionBar();
FragmentPagerAdapter adapter = new BaseFragmentPagerAdapter(this, getSupportFragmentManager(),
NewsFragment.newInstance();
EventsFragment.newInstance();
BulletinFragment.newInstance();
);
mViewPager.setAdapter(adapter);
mTabLayout.setupWithViewPager(mViewPager);
}
private void setupActionBar() {
setSupportActionBar(mToolbar);
ActionBar actionBar = getSupportActionBar();
if(actionBar != null) {
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
}
以及ViewPager
中包含的一个片段:
public class NewsFragment extends BaseFragment implements
Observer<DataResponse<NewsArticle>> {
@BindDimen(R.dimen.divider_padding_start) float mDividerPadding;
@Bind(R.id.recycler) RecyclerView mRecyclerView;
@Bind(R.id.progress) RecyclerView mProgressBar;
@Bind(R.id.refresh_layout) SwipeRefreshLayout mRefreshLayout;
@Inject RestService mRestService;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_recycler_refresh, container, false);
ButterKnife.bind(this, view);
mRefreshLayout.setColorSchemeColors(
ThemeUtil.getColorAttribute(getContext(), R.attr.colorAccent));
mRefreshLayout.setProgressBackgroundColorSchemeColor(
ThemeUtil.getColorAttribute(getContext(), R.attr.colorPrimary));
mRefreshLayout.setOnRefreshListener(this::getArticles);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.addItemDecoration(new DividerDecoration(getContext(), mDividerPadding));
getArticles();
return view;
}
@Override
public CharSequence getTitle(Context context) {
return context.getString(R.string.title_fragment_news);
}
@Override
publiv void onCompleted() {
mRefreshLayout.setRefreshing(false);
}
@Override
public void onError(Throwable exception) {
Timber.d(exception, "Failed to retrieve articles");
}
@Override
public void onNext(DataResponse<NewsArticle> response) {
mProgressBar.setVisibility(View.GONE);
ArticleAdapter adapter = new ArticleAdapter(getContext(), response.data());
adapter.setOnItemClickListener(this::onItemClick);
mRecyclerView.swapAdapter(adapter, false);
}
private void getArticles() {
mRestService.getNews().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread()).subscribe(this);
}
public void onItemClick(Article article) {
Intent intent = new Intent(getActivity(), ArticleDetailActivity.class);
intent.putExtra("article", article);
startActivity(intent);
}
}
公共类NewsFragment扩展了BaseFragment实现
观察者{
@BindDimen(R.dimen.divider\u padding\u start)浮动MDIViderAdding;
@Bind(R.id.recycler)RecyclerView mRecyclerView;
@绑定(R.id.progress)回收视图程序条;
@绑定(R.id.refresh_布局)SwipeRefreshLayout mRefreshLayout;
@注入RestService-mRestService;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u recycler\u refresh,container,false);
ButterKnife.bind(这个,视图);
mRefreshLayout.setColorSchemeColors(
getColorAttribute(getContext(),R.attr.colorAccent));
mRefreshLayout.setProgressBackgroundColorSchemeColor(
getColorAttribute(getContext(),R.attr.colorPrimary));
mRefreshLayout.setOnRefreshListener(this::getArticles);
setLayoutManager(新的LinearLayoutManager(getContext());
addItemDecoration(新的DividerDecoration(getContext(),mDividerPadding));
getArticles();
返回视图;
}
@凌驾
公共字符序列getTitle(上下文){
返回context.getString(R.string.title\u fragment\u news);
}
@凌驾
公共空间未完成(){
mRefreshLayout.setRefreshing(false);
}
@凌驾
公共无效报告人(可丢弃的例外情况){
Timber.d(例外,“未能检索物品”);
}
@凌驾
public void onNext(数据响应){
mProgressBar.setVisibility(View.GONE);
ArticleAdapter=新的ArticleAdapter(getContext(),response.data());
setonitemclick监听器(this::onItemClick);
mRecyclerView.swapAdapter(适配器,错误);
}
私人物品{
mRestService.getNews().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread()).subscribe(此);
}
公共无效的McClick(第条){
Intent Intent=新的Intent(getActivity(),ArticleDetailActivity.class);
意向。额外(“第条”,第条);
星触觉(意向);
}
}
我很好奇,所以我只是测试了一下。当我启动新的活动时,活动实际上并没有被销毁。它只有在我按下后退按钮后才会被销毁(然后重新创建)。我不明白它为什么会这样做,如果新活动开始时不需要销毁活动,为什么只在前台就需要销毁
我有另一个活动(mySettingsActivity
),它没有父级活动
,只在按下后退按钮时调用finish()
。如果我从我的ArticleActivity
启动此活动
,则ArticleActivity
永远不会被销毁,并完美地保存其状态。我在这里找到了我的答案:
在这里:
在子活动
中按下后退按钮后,父(ArticleActivity
)被销毁,因为这是“标准”启动模式的行为。我在清单中为ArticleActivity
设置了android:launchMode=“singleTop”
,这为我提供了所需的启动行为。现在,当在子活动中按“上一步”时,不会重新创建父级。但在启动新活动后似乎不会调用保存的实例状态
请改用“保存首选项”。@Sourabh已用代码更新。@Rod\u Algonquin真的吗?我是说,我想我可以,但那似乎太过分了。。。必须有一些更简单的东西,不是吗?@Bryan不,这不是一个过分的做法,而且你正在开始一个新的活动,因此所有保存的实例都将被销毁。