Мне нужен интерактивный элемент пользовательского интерфейса вместо Toast (могу ли я создать собственный тост с интерактивной функцией?) - PullRequest
4 голосов
/ 16 февраля 2011

Я разрабатываю приложение для новостной ленты RSS для Android и использую Toast.makeText() для отображения новостей или текущего обновления.Это должно войти в сеть по щелчку этого сообщения / новости.Проблема в том, что Toast не имеет API / функций, на которые я мог бы щелкнуть и зайти в Интернет, чтобы прочитать статью полностью.

Основное требование заключается в том, что мне нужно отображать новости по очереди, так чтоЯ не могу использовать список или любой другой виджет.

Может кто-нибудь предложить, какой элемент пользовательского интерфейса я должен использовать для решения этой проблемы?

Ответы [ 4 ]

5 голосов
/ 16 февраля 2011

Как вы обнаружили, с тостами нет абсолютно никакого взаимодействия с пользователем. Это вряд ли изменится, учитывая их цель.

О единственной другой вещи, которую я могу придумать, - использовать вместо нее Уведомления .

4 голосов
/ 16 февраля 2011

Если объем новостей очень низкий, вы можете использовать Уведомления в качестве предложенных, но, как я предполагаю, у RSS-канала может быть много вещей для уведомления, он будет заполнять список уведомлений, если вы хотите отображать их по одному.

Хотя тосты нельзя нажимать, вы можете создать занятие со специальной темой и эмулировать поведение тоста.


Подробные инструкции

Хорошо, поехали! =)

Чтобы прояснить ситуацию, я написал полный пример приложения, выполняющего роль тоста.

Первое, что нам нужно, это класс, который будет действовать как тост. Этот класс ничего не будет делать, кроме как показать себя и закончить через определенное время. Вы можете обрабатывать и другие события в соответствии с вашими потребностями, но это минимум, необходимый для воспроизведения поведения тоста.

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);
        }
    }

Как вы можете видеть, этот класс получает строку, переданную в качестве Extra для намерения, которое запустило действие, устанавливает отображаемый текст и устанавливает таймер в 1000 мс для вызова метода finish (). Время отображения может быть скорректировано, чтобы лучше соответствовать опыту пользователя.

Схема для этого действия очень проста:

<?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», который является фоном по умолчанию для тостов.

А теперь, чтобы сделать последний штрих, вам нужно установить тему в AndroidManifest.xml, установить прозрачный фон приложения и удалить заголовок.

<activity android:name=".MyPopup"
          android:label="@string/app_name"
          android:theme="@android:style/Theme.Translucent.NoTitleBar">
</activity>

Хитрость в этом заключается в свойстве android: theme. Theme.Translucent.NoTitleBar даст нам Activity с прозрачным фоном и без заголовка. Поэтому, когда отображается действие, будет виден только текст и фон тоста.

Хорошо, теперь у вас заблокирован и загружен рабочий поддельный тост. Но как это использовать ?! Сначала мы создаем фиктивное приложение для запуска всплывающих окон. Вам не понадобится это в вашем проекте, так как ваш собственный класс будет запускать тост.

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, какое сообщение отображать, мы используем метод Intent.putExtra(name,message). Эти данные возвращаются, когда MyPopup начинает использовать метод Intent.getStringExtra(name).

Исходный код моего примера вы можете получить здесь: http://www.mediafire.com/file/7vmuy8244vwh4dk/PopItUp.zip

Надеюсь, это вам поможет. =)

2 голосов
/ 16 февраля 2011

Как насчет пользовательского диалога?Вы можете сделать свой диалог более или менее похожим на тост.

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

0 голосов
/ 16 февраля 2011

Вы можете смоделировать поведение, похожее на тост, с помощью интерактивного элемента, но это займет немного работы.

Самый простой способ сделать это - использовать RelativeLayout в своей Деятельности. Если вы еще не используете RelativeLayout, вы можете просто обернуть свой текущий макет в один и просто установить для него layout_alignParentTop = true и установить для layout_width и layout_height значение fill_parent.

Внутри вашего RelativeLayout (под всем остальным содержимым, чтобы он не скрывался остальными элементами в вашей Деятельности), добавьте ваш clickable элемент с layout_alignParentBottom в true и используйте layout_marginBottom, чтобы добавить некоторые отступы. Этот элемент может быть простым TextView или настолько сложным, насколько вы хотите. Установите видимость «ушел» в XML, и там, где ваш код обычно отображает тост, вы можете установить видимость «видимый». Чтобы избавиться от этого, вы можете использовать Handler.postDelayed, чтобы вернуть видимость назад «ушел», или, если вы хотите быть модным, вы можете использовать AlphaAnimation для постепенного исчезновения.

...