android - 如何从 Widget 传递数据并打开 Activity? [安卓]

标签 android listview widget

在实现 RemoteViewsFactoryListProvider 类中,我将以下代码放在下面:

@Override
public RemoteViews getViewAt(int position) {
    RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.list_row);

rv.setTextViewText(R.id.heading, merch_name);
        rv.setTextViewText(R.id.content, teaser);

        Bundle extras = new Bundle();
        extras.putInt(WidgetProvider.EXTRA_ITEM, position);
        extras.putString(WidgetProvider.MERCHANT_ITEM, mWidgetItems.get(position).merchant_id);


        Intent fillInIntent = new Intent();
        fillInIntent.putExtras(extras);
        rv.setOnClickFillInIntent(R.id.llRow, fillInIntent);

  return rv;
}

我将日志放在 WidgetProvideronReceive 中,当我点击它时它有正确的 ID,但在打开 Activity 后它没有正确的 ID放入 extras。有时它也不会打开我提供的 Activity 而只是打开我的 MainActivity。当我从 recently open app 中删除我的应用程序然后使用 widget 时会发生这种情况。

这是我的 WidgetProvider 中的 onReceive 代码

 public class WidgetProvider extends AppWidgetProvider {

 public static final String TOAST_ACTION = "my.packagename.TOAST_ACTION";
public static final String MERCHANT_ITEM = "my.packagename.MERCHANT_ITEM";

@Override
public void onReceive(Context context, Intent intent) {
    AppWidgetManager mgr = AppWidgetManager.getInstance(context);

    if (intent.getAction().equals(TOAST_ACTION)) {
        int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);

        Intent goToDetails = new Intent(context, DetailsActivity.class);
        goToDetails.putExtra(Constants.MERCHANT_ID, intent.getStringExtra(MERCHANT_ITEM) );

        goToDetails.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(goToDetails);

      super.onReceive(context, intent);

    }

这就是我在 DetailsActivity 中获取 ID 的方式

 public class DetailsActivity extends Activity {

 String merchantID;

 @Override
protected void onCreate(Bundle savedState) {

 super.onCreate(savedState);
    setContentView(R.layout.detailsactivity);

  Bundle extras = getIntent().getExtras();
    if (extras != null) {
        merchantID = extras.getString(Constants.MERCHANT_ID);
    }

如何解决?提前谢谢你。

最佳答案

我在传递数据的 onReceive 中添加了 setData()

 @Override
public void onReceive(Context context, Intent intent) {
 super.onReceive(context, intent);

    if (intent.getAction().equals(TOAST_ACTION)) {
    int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);

    Intent goToDetails = new Intent(context, DetailsActivity.class);
    goToDetails.putExtra(Constants.MERCHANT_ID, intent.getStringExtra(MERCHANT_ITEM) );

    goToDetails.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    goToDetails.setData(Uri.parse(goToDetails.toUri(Intent.URI_INTENT_SCHEME)));
    context.startActivity(goToDetails);



}

}

但是我遇到了崩溃,如果我卸载应用程序然后安装并且没有先打开应用程序然后添加一个小部件并单击ListView .

找出它崩溃的原因,因为我的数据库仍然不存在。因为我在我的 SplashActivity

中创建我的数据库

关于android - 如何从 Widget 传递数据并打开 Activity? [安卓],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39587137/

相关文章:

ssl - 刚刚实现了 SSL。我的 tripadvisor 插件坏了/无法显示。有人知道为什么吗?

android - Flurry 未集成到 Android 应用程序中

java - RecyclerView - 获取特定位置的 View

android - 向 Android NDK 项目添加 Gstreamer 支持

android - 在 ListView 中用 CheckBoxes 检查每七个框

java - 如何在android中设备方向改变后保持listview项目的高亮

android - listView 中的滚动条...自定义它。

python - tkinter 列表框 get(ACTIVE) 方法

android - 透明点缀 OpenGL ES 2.0

java - 我应该在哪里设置逻辑以正确更新我的小部件?