- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Mosby MVP 库开发 Android 应用程序。在一个特定的 Fragment 中,ViewState 已实现但未使用(状态未更改或其他任何内容)。部分 View 逻辑由 widgetManager 实现。我正确地更改了状态,但行为很奇怪:在屏幕方向上,createViewState()
和 onNewViewStateInstance()
在 viewState apply()
之后被调用: 取消恢复 View 状态和相关行为。
你知道为什么会这样吗?
我已经将 ViewState 实现为 RestorableParcelableViewState
但同样的事情发生了。
调试后:循环进行:onSaveInstanceState (fragment)、saveInstanceState (viewstate)、onViewCreated (f)、apply (vs)、[正确行为但随后]、createViewState (f)、onCreate (f)、createPresenter (f ), onViewCreated (f) 然后一切再次为 null 并重新启动,就好像 fragment 是用 null savedInstanceState 创建的一样。
这是 fragment 的核心:
public class DashboardFragment extends AuthViewStateFragment<DashboardView,
DashboardPresenter> implements WidgetHolderView, FragmentSupportBack, DashboardView {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
protected void injectDependencies() { // called in onViewCreated
super.injectDependencies();
presenter = new DashboardPresenter(dataService, getContext());
}
@Override
public ViewState createViewState() {
return new DashboardViewState();
}
@Override
public void onNewViewStateInstance() {
widgetManager.bindToWidgetHolderView(this, dashboardType, dashboardId);
presenter.onNewInstance();
}
@Override
public DashboardPresenter createPresenter() {
return presenter;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
}
@Override
public void showLoading() {
((DashboardViewState) viewState).showSpinnerLoading();
loadingView.setVisibility(View.VISIBLE);
}
@Override
public void showContent() {
((DashboardViewState) viewState).showSpinner();
adapter.notifyDataSetChanged();
loadingView.setVisibility(View.GONE);
}
@Override
public void showError(String error) {
((DashboardViewState) viewState).showSpinnerError(new Throwable(error));
errorView.setVisibility(View.VISIBLE);
loadingView.setVisibility(View.GONE);
}
@Override
public void scrollList(List<Widget> widgets) {
((DashboardViewState) viewState).showSpinner();
((DashboardViewState) viewState).setData(widgets, widgetManager.getFeeder());
// scroll to widget
}
@Override
public void onStart() {
super.onStart();
adapter.resubscribeWidgetToFeeder();
}
@Override
public void onStop() {
adapter.unsubscribeWidgetFromFeeder();
super.onStop();
}
@Override
public void onDestroyView() {
adapter.flushReferencesToWidgetViews();
super.onDestroyView();
}
@Override
public void showSpinnerError(Throwable error) {
((DashboardViewState) viewState).showSpinnerError(new Throwable(error));
// show error
}
@Override
public void showSpinnerLoading() {
((DashboardViewState) viewState).showSpinnerLoading();
// Display loading icon for the spinner
}
@Override
public void setDashboardList(List<Dashboard> dashboardList) {
// Set DashboardList
this.dashboardList = dashboardList;
((MainActivity)getActivity()).setDashboardList(dashboardList);
}
@Override
public void showSpinner() {
((DashboardViewState) viewState).showSpinner();
// show spinner
spinner.setOnItemSelectedListener(selectedListener);
setSelectedDatacenter(DatacenetrUtils.datacenterId);
}
@Override
public void setData(List<Widget> widgets, Feeder feeder) {
widgetManager.setWidgets(widgets);
widgetManager.setFeeder(feeder);
adapter.setFeeder(widgetManager.getFeeder());
adapter.notifyDataSetChanged();
}
}
View 状态:
class DashboardViewState implements ViewState<DashboardView> {
private int state = LOADING;
private Throwable t;
private List<Widget> widgets;
private Feeder feeder;
@Override
public void apply(DashboardView view, boolean retained) {
switch (state) {
case LOADING:
view.showSpinnerLoading();
break;
case CONTENT:
view.showSpinner();
view.setData(widgets, feeder);
break;
case ERROR:
view.showSpinnerError(t);
break;
}
}
public void showSpinnerLoading() {
state = LOADING;
}
public void showSpinner() {
state = CONTENT;
}
public void setData(List<Widget> widgets, Feeder feeder) {
setWidgets(widgets);
setFeeder(feeder);
}
public void setWidgets(List<Widget> widgets) {
this.widgets = widgets;
}
public void setFeeder(Feeder feeder) {
this.feeder = feeder;
}
public void showSpinnerError(Throwable t) {
this.t = t;
state = ERROR;
}
}
主持人:
public class DashboardPresenter
extends Mvp2RxPresenter<DashboardView, List<Dashboard>> {
private final DataService dataService;
private final Context context;
public DashboardPresenter(DataService dataService, Context context) {
this.dataService = dataService;
this.context = context;
}
public void onNewInstance() {
if (isViewAttached())
getView().showSpinnerLoading();
if (isViewAttached()) getView().showSpinnerLoading();
subscribe(dataService.getDatacenters()
.concatMap(Observable::from)
.map(this::datacenterToDashboard)
.startWith(dataService.getCurrentUser()
.map(user -> {
Dashboard dashboard = new Dashboard (context.getString(R.string.dashboard_personalDashboard));
return dashboard;
}))
.toList()
, 0);
}
@Override
protected void onNext(List<Dashboard> data, int pr) {
if (isViewAttached()) {
getView().setDashboardList(data);
}
}
@Override
protected void onError(Throwable e, int pr) {
if (isViewAttached()) getView().showSpinnerError(e);
}
@Override
protected void onCompleted(int pr) {
if (isViewAttached()) getView().showSpinner();
}
}
最佳答案
我认为您不小心在 Activity 中的每个方向更改时添加了一个新的 DashboardFragment
,不是吗?
根据您的日志, fragment 生命周期事件(如 Fragment.onCreate()
)会在原始 fragment 恢复后再次调用。这强烈表明您正在创建一个全新的 DashboardFragment
并将其替换为之前的。
你会做这样的事情吗:
class MyActivity extends Activity {
public void onCreate(Bundle saved){
super.onCreate(saved);
if (saved == null) )
// Ensures that you only add one fragment the very first time the Activity starts
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, new DashboardFragment())
.commit();
}
}
}
请检查您是否有这样的“如果 Activity 是第一次启动,请添加 fragment ”。您还可以向 DashboardFragment.onCreateView()
添加一个断点,然后启动调试器并旋转您的设备。我认为您会看到有 2 个不同的 DashboardFragment
实例。
关于android - MvpViewStateFragment 不在屏幕方向上恢复 ViewState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42364207/
如何使用 HttpContext 访问当前页面的 ViewState 我有一个需要实现的 ViewStateUtil 类: public static T GetViewState(ViewS
我们最近将网站迁移到 .NET 4.5,其中一项更改是将 targetFramework="4.5"添加到 httpRuntime 以选择加入 ASP.NET 4.5 行为。一切都按预期工作,直到我们
来自 Microsoft 的页面 Understanding ASP.NET View State : in the instantiation stage of the page life cycl
我在我的 ASPX 页面上禁用了 ViewState: 我有以下类(class): public class DashboardUpdatePanel : UpdatePanel { pub
我同意 the best way to shorten the ViewState is to disable it在不需要它的 ASP.Net 控件上。从一开始就保持小规模是一个好习惯。 我还听说它
我正在解决我们应用程序的一些安全问题,我们将 ViewStateEncryptionMode 设置为 true(在 web.config 中)。我注意到仍然有一个 _VIEWSTATE 字段,现在在
Asp.Net 有一些选项可以影响页面的 ViewState 生成方式(加密、添加 mac、ViewStateUserKey)。 我想自己做,不是基于配置,而是基于我自己的使用其他算法进行序列化和加密
我对如何在 C# 中使用 ViewState 感到困惑,例如使用的好处是什么: ViewState["VST"]="Value1"; Lable1.Text= ViewState["VST"].ToS
背景: 我有一个页面,其中有各种使用 JavaScript 处理的客户端事件。我想将其中一些事件与服务器端事件“同步”,或者以其他方式从代码隐藏调用函数。 我想用 JavaScript 调用的一些函数
我有一个带有 primefaces 3.5 的 JSF 2.2.0-m12 应用程序。由于我将应用程序从 JBoss 7.1.1 移植到 Tomcat 7.0.39,重新加载页面后输入字段(输入文本、
我正在编写一个程序来解码编辑并在 python 中重新编码 ViewState。我已经成功地找到了 View 状态并解码了 base64 编码的字符串,但在尝试反序列化时遇到了困难。有没有办法使用 p
我可以尝试将一些数据保存到 ViewState,但收到此错误:Microsoft JScript 运行时错误:Sys.WebForms.PageRequestManagerServerErrorExc
我在一个页面上有几个 Div 标签,它们是动态的,即根据某些标准,它们对用户可见或不可见。我想将它们添加到页面的 View 状态,以便在回发时它们不会再次隐藏,我该怎么做? 最佳答案 我只会使用 AS
抓这个! 我已经用谷歌搜索了这个。1. 假设我有一个包含几个文本框的网络表单,ID 为 textbox1、textbox2、textbox3。他们都启用了 View 状态。我在这些文本框中放置了一些值
代码隐藏中有一些 View 状态的东西,然后有一个更新面板。当我将其添加到母版页引用的子页面时,它破坏了我之前从用户控件中获得的所有以前可用的功能。 child 掌握后面的页面代码 protected
假设我有一个对象集合 List collection = new List(); 以及将插入这些对象的字典 Dictionary> sections = new Dictionary>(); // e
我编写了一些网页,这些网页使用需要 ViewState 值的常见例程。 能否将 ViewState 传递到函数中? 如果是,怎么做到的? 如果没有,我还能如何从类中的方法访问它们? 最佳答案 这是关键
问题是,我需要在 CallBack 请求期间保留 ViewState。 我知道当请求是 CallBack 时,ASP.NET 默认情况下不会保存页面状态。所以,我需要一个替代方案来让它工作。 ASP.
我有一个 List 类型的列表.我想将它存储在 ViewState 中。如何做到这一点? private List JobSeekersList { get; set; } 最佳答案 基本上你只需要使
我编写了一个 ASP.NET 应用程序,它在服务器的 IIS7 中运行。如果我在浏览器中打开此网络表单并向我显示站点代码,我会看到... 我有很多控件,如按钮、标签、文本框和 ListView。我尝试
我是一名优秀的程序员,十分优秀!