【问题标题】:what method I must use Instead of findViewById in app widget?我必须在应用小部件中使用什么方法而不是 findViewById?
【发布时间】:2017-06-16 11:25:57
【问题描述】:

当我使用 findViewById() 时出现错误。
我应该在我的应用小部件中使用什么方法,而不是 findViewById()

P.S.:我想做类似的事情:

 Button a = (Button) findViewById(R.id.button);

在我的屏幕小部件中

【问题讨论】:

  • 没有这种方法,类似于findViewById。 RemoteViews 以另一种方式工作。你不能直接操纵它们。
  • 你能描述一下你得到什么样的错误,这样方便给出解决方案。

标签: android android-widget


【解决方案1】:

你不需要在 Widget 中使用 findViewById() 就可以了

创建一个静态变量,这将是您的 onClick 名称标签:

private static final String MyOnClick = "Button OnClick";

将此 onClick 标记设置为您的视图,如下所示:

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main);
views.setTextViewText(R.id.your_button, "Button Name");
views.setOnClickPendingIntent(R.id.your_button, MyOnClick);

像下面这样获取按钮点击监听器

public void onReceive(Context context, Intent intent) {

if (MyOnClick.equals(intent.getAction())){
    //your onClick action is here
  }
};

这里总代码

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

public class Widget extends AppWidgetProvider {
    private static final String SYNC_CLICKED    = "automaticWidgetSyncButtonClick";

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        RemoteViews remoteViews;
        ComponentName watchWidget;

        remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        watchWidget = new ComponentName(context, Widget.class);

        remoteViews.setOnClickPendingIntent(R.id.sync_button, getPendingSelfIntent(context, SYNC_CLICKED));
        appWidgetManager.updateAppWidget(watchWidget, remoteViews);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        super.onReceive(context, intent);

        if (SYNC_CLICKED.equals(intent.getAction())) {

            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

            RemoteViews remoteViews;
            ComponentName watchWidget;

            remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
            watchWidget = new ComponentName(context, Widget.class);

            remoteViews.setTextViewText(R.id.sync_button, "TESTING");

            appWidgetManager.updateAppWidget(watchWidget, remoteViews);

        }
    }

    protected PendingIntent getPendingSelfIntent(Context context, String action) {
        Intent intent = new Intent(context, getClass());
        intent.setAction(action);
        return PendingIntent.getBroadcast(context, 0, intent, 0);
    }
}

【讨论】:

  • 这是在 OnCreate 中?
  • 这个循环是什么: for (int appWidgetId : appWidgetIds) { updateAppWidget(context, appWidgetManager, appWidgetId); }
  • 查看link
  • 错误:(96, 2) 错误: 解析时到达文件末尾
  • 和错误:任务 ':app:compileDebugJavaWithJavac' 的执行失败。 > 编译失败;有关详细信息,请参阅编译器错误输出。
【解决方案2】:

appWidgetProvider 类不允许findViewById()。为此,您需要使用RemoteView 类的函数。

CharSequence Method | Android Developers

在你的情况下:

remoteViews.setCharSequence(R.id.button,String MethodName(onClick),String Value);

它适用于 EditText、TextView、TextClock。 您可以将 String MethodName 替换为 getText、setText、setTimeZone 等方法的名称。 对于 Buttons RemoteViews 提供以下功能

setOnClickResponse | Android Developers

这相当于

View.setOnClickListener(android.view.View.OnClickListener)

现在还有很多其他方法可用,例如setFloat()setLong(),它们的工作原理与setCharSequence() 相同。

您可以根据要传递的参数的数据类型在它们之间进行选择。

这里是了解和查看所有RemoteView功能列表的链接

RemoteViews | Android Developers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2013-05-24
    • 2014-11-13
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    相关资源
    最近更新 更多