我需要一个可点击的UI元素而不是Toast(我可以创建具有可点击功能的自定义Toast吗?)

时间:2011-02-16 16:00:07

标签: android rss feed

我正在为Android开发RSS新闻源应用,并使用Toast.makeText()来显示新闻或当前更新。它必须在点击该消息/新闻时上网。问题是Toast没有API /功能,我可以点击它,然后在网上阅读完整的文章。

主要要求是我需要逐个显示新闻,因此我无法使用列表或任何其他小部件。

任何人都可以建议我应该用什么UI元素来解决这个问题?

4 个答案:

答案 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)

自定义对话框怎么样?您可以使对话框看起来或多或少像烤面包一样。

http://developer.android.com/guide/topics/ui/dialogs.html

答案 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淡入/淡出。