For me I have a button widget with a button that is just suppose to launch a helloworld activity when I click it. I've tried following many posts online including this one, and yet the problem still there. I press the button, nothing happens. I am working on version 2.3 of android. Can someone point out what I am doing wrong?
My widget:
public class IconWidgetProvider extends AppWidgetProvider {
#Override
public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) {
final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
final Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
// first param is app package name, second is package.class of the main activity
final ComponentName cn = new ComponentName("com.followup","com.followup.FollowUpActivity");
intent.setComponent(cn);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final PendingIntent myPI = PendingIntent.getActivity(context, 0, intent, 0);
final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.icon_widget_layout);
views.setOnClickPendingIntent(R.id.image_in_widget, myPI);
final AppWidgetManager mgr = AppWidgetManager.getInstance(context); mgr.updateAppWidget(cn, views);
}
}
}
homescreeniconinfo.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="146dip"
android:minHeight="72dip"
android:updatePeriodMillis="0"
android:initialLayout="#layout/icon_widget_layout" >
</appwidget-provider>
icon_widget_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<Button android:name="#+id/image_in_widget"
android:contentDescription="#string/iconDescription"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight=".50"
android:clickable="true"
/>
</LinearLayout>
mainifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.followup"
android:versionCode="1"
android:versionName="1.0" >
.
.
.
<application
android:icon="#drawable/ic_launcher"
android:label="#string/app_name" >
.
.
.
<!-- Home icon widget -->
<receiver android:name="IconWidgetProvider"
android:label="#string/app_name"
android:icon="#drawable/ic_launcher">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="#xml/homescreeniconinfo" />
</receiver>
<activity
android:name=".FollowUpActivity"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Have you tried adding the event handler to your button?
Perhaps I'm confused here as it's been a while since I actually did some intense android programming, but from what I understand, this is what I've done to call an intent from another one in the past...
<Button android:name="#+id/image_in_widget"
android:contentDescription="#string/iconDescription"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight=".50"
android:clickable="true"
android:onClick="onClickFunction"
/>
Paying extra attention to
android:onClick="onClickFunction"
Where "onClickFunction" would be a written method somewhere in your code that gets called when the button is clicked
public void onClickFunction(View view){
//stuff to do on click
}
EDIT
This is ripped straight from the HelloWorld android tutorial which I have compiled and successfully run on my 2.3 Android Phone in the past
this is the xml
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#string/button_send"
android:onClick="sendMessage" />
this is in the main .java file
/* called when the user clicks a button */
public void sendMessage(View view)
{
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText)findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
DisplayMessageActivity.class is the class that is essentially a new application (from your case I believe you want it to be a Hello World app)
so you would make an XML for that called application and change/rewrite the DisplayMessageActivity class to do whatever "HelloWorld"-ey stuff you want...
Related
I have an application and I have also created an app widget for it. The app widget is just a shortcut to launch application.
My manifestfile:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hansem.handbookmanual"
android:installLocation="internalOnly"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:exported="true"
android:theme="#style/AppTheme" >
<receiver android:name="com.example.HandbookAppWidgetProvider" android:label="abc">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="#xml/widget1_info" />
</receiver>
<activity
android:name="com.example.BrowserLauncherActivity"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Widget1_info.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="72dp"
android:minHeight="72dp"
android:minResizeHeight="72dp"
android:resizeMode="vertical"
android:updatePeriodMillis="0"
android:initialLayout="#layout/widget1">
</appwidget-provider>
Widget1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/button_applaunch"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="4dp"
android:background="#drawable/ic_launcher"
android:gravity="center"
android:orientation="vertical" >
</LinearLayout>
I have tried all the solution mentioned on Stackflow but noting helped. On restarting the device, the widget gets added, but normally by just installing the app on phone and launching it, the widget is not added.
AppWidgetProviderCode:
public class HandbookAppWidgetProvider extends AppWidgetProvider {
DateFormat df = new SimpleDateFormat("hh:mm:ss");
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
Log.i("ExampleWidget", "Updating widgets " + Arrays.asList(appWidgetIds));
// Perform this loop procedure for each App Widget that belongs to this
// provider
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, BrowserLauncherActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget1);
views.setOnClickPendingIntent(R.id.button_applaunch, pendingIntent);
// To update a label
//views.setTextViewText(R.id.widget1label, df.format(new Date()));
// Tell the AppWidgetManager to perform an update on the current app
// widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
Please help
I am doing a simple widget for the first time and it seems the tutorial I'm using has something missing because my LogCat states "Error inflating AppWidget" when selecting it from the pop up list of widgets.
According to the tutorial I did these.
Layout:
<TextView android:id="#+id/widget_textview" android:text="#string/widget_text"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_gravity="center_horizontal|center"
android:layout_marginTop="5dip" android:padding="10dip"
android:textColor="#android:color/black" />
</LinearLayout>
Class:
package hello.widget;
import android.appwidget.AppWidgetProvider;
public class HelloWidget extends AppWidgetProvider {
}
Strings:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Hello Widget</string>
<string name="widget_text">Hello Widget!</string>
</resources>
Widget Provider:
<?xml version="1.0" encoding="utf-8"?>
appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android">
android:minWidth="146dip"
android:minHeight="72dip"
android:updatePeriodMillis="10000"
android:initialLayout="#layout/main"
</appwidget-provider>
Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="hello.widget" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="3" />
<application android:icon="#drawable/icon" android:label="#string/app_name">
<!-- Broadcast Receiver that will process AppWidget updates -->
<receiver android:name="hello.widget.HelloWidget" android:label="#string/app_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="#xml/hello_widget_provider" />
</receiver>
</application>
</manifest>
You are missing the opening <LinearLayout> in your layout file. What you have here should not even compile.
You are also missing the entire implementation of your AppWidgetProvider. You need to implement onUpdate() to specify what the app widget should be displaying.
Also, your updatePeriodMillis is shorter than allowed -- you cannot update an app widget every 10 seconds this way.
Also, make sure that your layout is named main.xml, or update your android:initialLayout to reflect the proper name of the layout.
My solution:
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action))
{
long days = (((calendar.getTimeInMillis()- date1.getTime())/1000))/86400;
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
//Intent AlarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER).setComponent(new ComponentName("com.android.alarmclock", "com.android.alarmclock.AlarmClock"));
// PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, AlarmClockIntent, 0);
Intent Date_Change= new Intent(Intent.ACTION_DATE_CHANGED);
PendingIntent pendingIntent2=PendingIntent.getActivity(context,0, Date_Change, 0);
views.setOnClickPendingIntent(R.id.textView1, pendingIntent2);
views.setTextViewText(R.id.textView1,""+days);
//views.setOnClickPendingIntent(R.id.AnalogClock, pendingIntent);
//AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, Widget.class);
appWidgetManager.updateAppWidget(thisWidget, views);
}
}
I am new to android widget.I did sample application , that want to show time .How to call widget from activity:
I tried like this but It say Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.weather/com.weather.CurrentCity}; have you declared this activity in your AndroidManifest.xml?
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.weather"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="#drawable/icon" android:label="Weather">
<!-- Broadcast Receiver that will process AppWidget updates -->
<receiver android:name=".CurrentCity" android:label="#string/app_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="#xml/hello_widget_provider" />
</receiver>
<activity android:name=".WeatherActivity"
android:label="Weather Application">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
and my initail activity :
public class WeatherActivity extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent showContent = new Intent(getApplicationContext(),CurrentCity.class);
startActivity(showContent);
}
and my widget activity:
public class CurrentCity extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1,
1000);
}
private class MyTime extends TimerTask {
RemoteViews remoteViews;
AppWidgetManager appWidgetManager;
ComponentName thisWidget;
DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM, Locale.getDefault());
public MyTime(Context context, AppWidgetManager appWidgetManager) {
this.appWidgetManager = appWidgetManager;
remoteViews = new RemoteViews(context.getPackageName(),
R.layout.current_weather);
thisWidget = new ComponentName(context, CurrentCity.class);
}
#Override
public void run() {
remoteViews.setTextViewText(R.id.country,"Time = " + format.format(new Date()));
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}
}
}
and I have created main.xml & current_weather.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView android:id="#+id/country"
android:text="TextView"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_margin="10dp"
android:textColor="#color/solid_yellow"
></TextView>
</RelativeLayout>
and I created hello_widget_provider.xml.xml in the res/xml/hello_widget_provider.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="146dip"
android:minHeight="72dip"
android:updatePeriodMillis="10000"
android:initialLayout="#layout/main"
/>
Please help me
Thanks in advance
What you are trying to do is effectively impossible. You do this:
Intent showContent = new Intent(getApplicationContext(),CurrentCity.class);
startActivity(showContent);
You can not invoke a widget this way: a widget does not have an Activity you can show.
You need to follow very closely the tutorial at http://developer.android.com/guide/topics/appwidgets/index.html: there is really no succinct way I can think of to convert your code into a working widget, but the guide has everything you need to know/do to make a working widget.
EDIT: note that your widget must be added to the widget container (probably the home screen) and can not be added programmatically. The user of the Android device must do it manually.
I tried to do this in many different ways. But, in Android there is no intent or similar alternative, which can invoke a widget via activity (I mean application). You have to drag the widget and drop it on your home screen.
But, yes, other ways it is possible!
I am trying to transfer an int value between two activities using intents, but my app keeps crashing. When I comment out the transfer of any data and simply use an intent, everything seems to work. I cannot tell what is wrong.
Activity 1 (HeartRateActivity):
//Imports
public class HeartRateActivity extends Activity {
/** Called when the activity is first created. */
Button nextActivity;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
nextActivity = (Button)findViewById(R.id.nextActivity);
nextActivity.setOnClickListener(new Button.OnClickListener(){
#Override
public void onClick(View v) {
Intent intent = new Intent(HeartRateActivity.this, NextActivity.class);
intent.putExtra("age", 2);
startActivity(intent);
}
});
}
}
My NextActivity.java
package com.heartRate;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class NextActivity extends Activity {
TextView display;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.next);
int age = getIntent().getIntExtra("age", 0);
display = (TextView) findViewById(R.id.display);
display.setText(age);
}
}
My AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.heartRate" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="#drawable/icon" android:label="#string/app_name">
<activity android:name=".HeartRateActivity"
android:label="#string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity android:name=".NextActivity"
android:label="#string/app_name" />
</application>
</manifest>
My main.xml (used by HeartRateActivity)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="#string/hello"
/>
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
android:id="#+id/nextActivity" android:text="nextActivity"></Button>
</LinearLayout>
My next.xml(used by NextActivity) is similar and i dont think thats the issue...:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="TextView" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="#+id/display"></TextView>
</LinearLayout>
I would appreciate help in solving this issue! Thank you
Replace
display.setText(age);
with
display.setText(Integer.toString(age));
If you provide an int as a parameter, it uses it as a resource ID, which, in this case, obviously doesn't exist.
just try do like this.
display = (TextView) findViewById(R.id.display);
display.setText(Integer.toString(age));
and surely it will work
Make sure that your Id and Intent Destination all must be Ok.
then just put between intent from initialize ans start.
with put
intent.putExtra("age", Double);
from get this.
double d = getIntent().getStringExtra("age");
Make sure that R.id.display is a valid TextView in your next layout.
Just so we're clear, you're saying when you include the ...
intent.putExtra("age", 2);
in the sending Activity, and the ...
int age = getIntent().getIntExtra("age", 0);
in the receiving Activity, the application crashes or expereinces problems? And, by excluding those 2 statements the application performs normally? I'm just curious what does LogCat show? Even though you application is crashing LogCat will have several entries as to what was happening just prior to the close.
Looked like my #$#%$%#$ the receiver was not i application element in manifest
Hi
I just created the helloworld appwidget to see how its works. i followed the dev example on adroid dev site. But for some reason the widget does not want to show in the widget list.
AndroidManifest.xml
<receiver android:name="VoiceRIAWidget" android:label="Voice RIA">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="#xml/appwidget_info" />
</receiver>
appwidget_info.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:label="Voice RIA" android:minWidth="50dp" android:minHeight="50dp"
android:updatePeriodMillis="86400000" android:initialLayout="#layout/appwidget">
</appwidget-provider>
VoiceRIAWidget
public class VoiceRIAWidget extends AppWidgetProvider
{
#Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds)
{
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++)
{
int appWidgetId = appWidgetIds[i];
CharSequence text = "Hello";
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.appwidget);
views.setTextViewText(R.id.appwidget_text, text);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
appwidget.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/appwidget_text" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textColor="#ff000000" />
I cant see what i am missing it runs but nothing in list.
I just had the same problem. My mistake was, that i put the receiver tag just inside my manifest tag, when i was supposed to put it inside my application-tag.
This was my not-working-XML:
<manifest....>
....
<receiver ...>
...
</receiver>
<application ...>
...
</applciation>
</manifest>
This is my well-working-XML:
<manifest...>
....
<application...>
...
<receiver...>
...
</receiver>
</application>
</manifest>
Hope it helps you!
I just had the same problem. My mistake was, that I building an app widget as addition to an existing app which was installed on sd-card. Moving the app to phone fixed it.
faced the similar problem . I was putting meta data outside the receiver which you have already done correctly in first place.