我正在为Android开发RSS新闻源应用,并使用Toast.makeText()
来显示新闻或当前更新。它必须在点击该消息/新闻时上网。问题是Toast
没有API /功能,我可以点击它,然后在网上阅读完整的文章。
主要要求是我需要逐个显示新闻,因此我无法使用列表或任何其他小部件。
任何人都可以建议我应该用什么UI元素来解决这个问题?
答案 0 :(得分:5)
正如您所发现的,绝对没有用户与Toasts交互。鉴于其目的,这不太可能改变。
关于我能想到的唯一另一件事是使用Notifications代替。
答案 1 :(得分:4)
如果新闻量非常低,你可以使用Notifications作为sugested,但是我认为RSS feed可能有很多东西需要通知,如果你想逐个显示它们,它会淹没通知列表。
虽然无法点击Toasts,但您可以使用特殊主题创建活动并模拟Toast行为。
好的,我们走吧! =)
为了清楚起见,我最终编写了一个充当Toast的应用程序的完整示例。
我们需要的第一件事是作为我们的祝酒词。这节课除了展示自己并在一段时间后完成后,什么都不做。您也可以处理其他事件以满足您的需求,但这是重现Toast行为所需的最低要求。
package com.rchiossi.popup;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
public class MyPopup extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_popup);
String message = getIntent().getStringExtra("message");
TextView messageView = (TextView) findViewById(R.id.message);
messageView.setText(message);
Handler handler = new Handler();
long delay = 1000;
handler.postDelayed(new Runnable() {
@Override
public void run() {
MyPopup.this.finish();
}
}, delay);
}
}
如您所见,此类获取一个String,该String已作为Extra传递给启动活动的intent,设置要显示的文本,并为要调用的finish()方法设置1000ms的计时器。可以调整显示时间以更好地适应用户体验。
此活动的布局非常简单:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@android:drawable/toast_frame"/>
</RelativeLayout>
此布局只不过是一个空白屏幕,中间有文字。这里的技巧是将TextView背景设置为“@android:drawable / toast_frame”,这是Toasts的默认背景。
现在,为了给它最后的触摸,你需要在AndroidManifest.xml中设置主题以将应用程序背景设置为透明并删除标题。
<activity android:name=".MyPopup"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
</activity>
这里的技巧是android:theme属性。 Theme.Translucent.NoTitleBar将为我们提供一个透明背景且没有标题栏的活动。因此,当显示活动时,只显示文本和Toast背景。
好,现在你有一个工作的假面包被锁定和装载。但是如何使用呢?! 首先,我们创建一个虚拟应用程序作为我们的弹出启动器。您不需要在项目中使用它,因为您自己的类将启动Toast。
package com.rchiossi.popup;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Main extends Activity {
/** Called when the activity is first created. */
private int mCount = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(Main.this,MyPopup.class);
intent.putExtra("message", "My popup number " + mCount);
mCount++;
startActivity(intent);
}
});
}
}
此应用程序基本上只是一个按钮,按下时会显示带有消息的Toast。如您所见,要告诉您的Toast应用程序要显示哪条消息,我们使用Intent.putExtra(name,message)
方法。当MyPopup开始使用Intent.getStringExtra(name)
方法时,此数据将被拯救。
您可以从此处获取我的示例的源代码: http://www.mediafire.com/file/7vmuy8244vwh4dk/PopItUp.zip
我希望它会帮助你。 =)
答案 2 :(得分:2)
自定义对话框怎么样?您可以使对话框看起来或多或少像烤面包一样。
答案 3 :(得分:0)
您可以使用可点击元素模拟类似吐司的行为,但这需要一些工作。
最简单的方法是在Activity中使用RelativeLayout。如果您尚未使用RelativeLayout,则只需将当前布局包装为一个,然后将其设置为layout_alignParentTop = true,并将layout_width和layout_height设置为fill_parent。
在RelativeLayout中(在所有其他内容之下,因此它不会被Activity中的其余元素隐藏),将layout_alignParentBottom的可点击元素添加到true,并使用layout_marginBottom添加一些填充。这个元素可以是一个简单的TextView,也可以像你想要的那样复杂。将可见性设置为xml中的“已消失”,以及代码通常显示吐司的位置,您可以将可见性设置为“可见”。要摆脱它,您可以使用Handler.postDelayed将可见性设置为“已消失”,或者如果您想要花哨,可以使用AlphaAnimation淡入/淡出。