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);
意向。额外(“第条”,第条);
星触觉(意向);
}
}

我很好奇,所以我只是测试了一下。当我启动新的
活动时,
活动实际上并没有被销毁。它只有在我按下后退按钮后才会被销毁(然后重新创建)。我不明白它为什么会这样做,如果新活动开始时不需要销毁
活动,为什么只在前台就需要销毁

我有另一个活动(my
SettingsActivity
),它没有父级
活动
,只在按下后退按钮时调用
finish()
。如果我从我的
ArticleActivity
启动此
活动
,则
ArticleActivity
永远不会被销毁,并完美地保存其状态。

我在这里找到了我的答案:

在这里:


在子
活动
中按下后退按钮后,父(
ArticleActivity
)被销毁,因为这是“标准”启动模式的行为。我在清单中为
ArticleActivity
设置了
android:launchMode=“singleTop”
,这为我提供了所需的启动行为。现在,当在子
活动中按“上一步”时,不会重新创建父级。

但在启动新活动后似乎不会调用保存的实例状态
请改用“保存首选项”。@Sourabh已用代码更新。@Rod\u Algonquin真的吗?我是说,我想我可以,但那似乎太过分了。。。必须有一些更简单的东西,不是吗?@Bryan不,这不是一个过分的做法,而且你正在开始一个新的活动,因此所有保存的实例都将被销毁。