2015-06-30 70 views
0

在我的一个应用程序中,我有一种情况,用户输入页面并显示进度条,直到服务器返回响应。如果服务器返回错误或用户没有互联网(或任何其他问题),则图像视图将显示下面的错误消息。下面是我的问题:将带有imageview和error msg的布局放置在常规布局xml中的布局是否更好,该布局是可见性=已消失的活动,然后在发生错误时使其可见,还是更好地制作单独的layout.xml只是为了错误,并做一个setcontentview,如果错误发生?如果我将setcontentview用于另一个布局,那么当新布局膨胀时,用户将看到白色闪光,而我不太喜欢这一点。另一方面,将错误布局保留在常规布局内可能会损失内存通常不会被普通用户看到的东西。当然,还有第三种选择 - 以编程方式添加错误屏幕 - 但是如果错误屏幕的布局更加复杂,则会出现复杂问题。什么是最有效的选择?Android:实现错误屏幕

伪代码如下:

<LinearLayout 
android:id="@+id/mainLayout" 
> 
.. layout code 

<LinearLayout 
android:id="@+id/errorLayout" 
android:visibility="gone" 
> 

</LinearLayout> 

</LinearLayout> 

编辑:我以前参与在某些情况下ViewStub的组合最终的解决方案(其中背景动作需要是不可见的,但我不希望在消耗内存可能不会显示的东西)和DialogFragment(后台活动需要透明显示)。这个问题促使我认识的众多android开发人员之间进行了激烈的离线辩论 - 其中一些人支持下面给出的活动答案,因为它最好支持材料设计样式,而其他人则支持使用对话框片段,因为使用活动来实现类似这可能是矫枉过正的(额外的类,需要将其添加到清单,重复的工具栏逻辑等)。感谢所有贡献的人。

第二次编辑:在处理完这个问题之后,我还没有确定对话框片段解决方案。如果您在屏幕上显示错误,并且您希望用户认为它是屏幕的有机部分,则顶部工具栏必须是可点击的。一个dialogfragment离开顶部工具栏可见,但点击它并没有被注册,因为即使dialogfragment的尺寸没有占用整个屏幕,它仍然在片段管理器的“整个”屏幕上它自己的层中,并且窃取了所有点击。我倾向于认为真正做到这一点的唯一方法是使用viewstub。

+0

为什么你不能使用DialogFragment与您的错误信息? –

+0

查看我之前关于dialogfragment回答的对话 – Jon

回答

1

使用DialogFragment,它会出现在您的活动上并显示错误。您可以为片段设置自己的布局,以及处理错误的代码。不要尝试在一个xml布局中将可能显示给用户的每一个可能的东西编码。

How to use Dialog Fragment? (showDialog deprecated) Android

编辑:添加一些链接,如果你想查找如何使dialogFragments全屏(即非浮动)。

Full Screen DialogFragment in Android

http://www.techrepublic.com/article/pro-tip-unravel-the-mystery-of-androids-full-screen-dialog-fragments/

+0

设计规范不允许我将错误显示为对话框片段 - 它必须出现而不是活动内容 – Jon

+1

如果您可以更具体一点,您的声明对于是否需要错误的“设计规范”非常模糊“出现而不是活动内容”是指外观或别的东西。 – NameSpace

+0

这是真的 - 我为歧义道歉。如果我可以使用对话框片段或其他浮动元素,它将使整个情况变得更加容易 - 事实上,我已经在其他地方使用了该解决方案 - 但在这种情况下,这是不可能的。在任何情况下,非常感谢您的帮助 – Jon

1

我真的建议你启动一个全新的Activity,因为这是更好的做法,而且更清洁,而不是在一个Activity的背景中有很多隐形物品。您也真的不想调用setContentView()并将新布局应用于您的原始Activity。您可以启动新的Activity并通过意向附加个别错误信息:

Intent intent = new Intent(this, ErrorActivity.class); 
String errorMessage = "This is a custom error message."; 
intent.putExtra("errorMessage", errorMessage); 
startActivity(intent); 

然后ErrorActivity内就可以收到特定的错误信息,像这样:

String errorMessage = getIntent().getExtras().getString("errorMessage"); 

那么你将要展示它在的ErrorActivity的的onCreate()一TextView

TextView errorText = (TextView) findViewById(R.id.errorText); 
errorText.setText(errorMessage); 

希望这可以帮助,但随时来查询你有任何问题。

+0

这种方法的问题是,如果用户没有互联网连接,并且我向他显示了一个重试按钮,那么重试按钮将重新启动原始活动,并且我得到到两个活动之间的乒乓球,直到用户放弃或问题得到解决为止 – Jon

+1

@Jon我确实看到了你的观点,但在一天结束时,如果你的应用程序需要互联网连接,那么你可以做很多事情来帮助你用户。我建议,如果您担心这一点,请检查用户在重试按钮的onClick()中是否有互联网连接。如果你这样做,那么它不会乒乓,因为它只会让他们重试,如果他们连接到WiFi连接或移动网络可用。 – edwoollard