PDA

View Full Version : آموزش ساخت ویجت برای نرم افزار



bgalborz
سه شنبه 14 آذر 1391, 23:23 عصر
با سلام به مهندسین عزیز
یه سوال فنی داشتم وبه جوابش احتیاج دارم
یه برنامه نوشتم که میخوام براش ویجت هم بزارم که تو صفحه نمایش نشون بده و احتیاج به راهنمایی دارم.

Nevercom
چهارشنبه 15 آذر 1391, 01:27 صبح
مرحله ی اول: باید یک receiver به Manifest اضافه کنید و ویجت رو به سیستم معرفی کنید:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Sherlock.Light" >
.
.
.
<receiver
android:name=".HomescreenWidget"
android:label="@string/app_name"
tools:ignore="ExportedReceiver" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>

<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget" />
</receiver>
</application>
در خط 9 نام کلاسی که ویجت رو کنترل میکنه می نویسیم (آدرس دهی بر اساس الگوی پکیج)
در خط 18 هم یک فایل xml که Widget provider‌هست و حاوی اطلاعات ویجت هست رو معرفی می کنیم.

مرحله ی دوم: ساخت Widget Provider، بر اساس الگوی زیر فایل رو میسازید (از بخش New Android XML میتونید این فایل رو بسازید)
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget_layout"
android:minHeight="40dp"
android:minWidth="250dp"
android:updatePeriodMillis="0" >

</appwidget-provider>
در خط سوم فایل XML مربوط به Layout ویجت رو معرفی می کنیم
خط چهارم و پنجم مربوط به سایز ویجت هست، از اونجایی که اندازه ی ویجت بر اساس Grid هست باید تبدیل رو انجام بدید، اگر اشتباه نکنم سایزی که نوشتم برای اندازه 1x4 هست (به مستندات اندروید مراجعه کنید)
خط بعد هم مشخص میکنه هر چند میلی ثانیه ویجت آپدیت بشه، سعی کنید مقدار زیاد پایینی نباشه، توصیه میشه که حداقل این مقدار هر نیم ساعت باشه (گمان کنم مقدار 0 یعنی هیچوقت آپدیت نشه، مطمئن نیستم)

Layout رو هم بر اساس اندازه ای که در نظر گرفتید بسازید.

مرحله ی بعد هم نوشتن کلاسی هست که ویجت رو کنترل کنه
کد زیر یک نمونه هست:
package com.nevercom.android.uptodate;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import static com.nevercom.android.uptodate.MainActivity.*;

public class HomescreenWidget extends AppWidgetProvider {

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);

for (int i = 0; i < appWidgetIds.length; i++) {
int appWidgetId = appWidgetIds[i];
// get a reference to widget
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
// create a new intent to start MainActivity
Intent intent = new Intent(context, MainActivity.class);
// put an extra to the intent, to invoke search
intent.putExtra(SEARCH_EXTRA, true);
PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.widget_bg, pending);

appWidgetManager.updateAppWidget(appWidgetId, views);

}
}


}

در این کد هنگام کلیک روی یک دکمه در ویجت، توسط PendingIntent، یک اکتیویتی اجرا میشه.

programmer.net2009
یک شنبه 10 دی 1391, 15:24 عصر
سلام دوست عزیز، من از این کدی که گذاشتید استفاده کردم، اما اکتیویتی که می خواستم اجرا نشد.
خیلی دنبال این مشکل گشتم، اما اصلا درست نشد. میشه بیشتر راهنمایی کنید که چه کار باید انجام بدم که اکتیویتی اجرا بشه؟
با تشکر

Nevercom
یک شنبه 10 دی 1391, 20:04 عصر
تو کدهای بالا هرموقع روی View ای با مشخصه ی R.id.widget_bg کلیک بشه، اکتیویتی ای با نام MainActivity اجرا میشه.
اگر همه ی موارد بالا رو رعایت کردید و باز هم اکتیویتی اجرا نمیشه، کدهاتون رو قرار بدید تا بررسی بشه.

programmer.net2009
یک شنبه 10 دی 1391, 21:54 عصر
سلام دوست عزیز

این کد برای ویجت هست:


package com.mohammad.datecounter;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import static com.mohammad.datecounter.ShowDifference.*;

public class mywidget extends AppWidgetProvider {


@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);

for (int i = 0; i < appWidgetIds.length; i++) {
int appWidgetId = appWidgetIds[i];
// get a reference to widget
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
// create a new intent to start MainActivity
Intent intent = new Intent(context, ShowDifference.class);
// put an extra to the intent, to invoke search
intent.putExtra(SEARCH_SERVICE, true);
PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.button1, pending);

appWidgetManager.updateAppWidget(appWidgetId, views);

}
}
}



از این کد برای کنترل کننده ویجت استفاده کردم :



<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget_layout"
android:minHeight="40dp"
android:minWidth="40dp"
android:updatePeriodMillis="0" >

</appwidget-provider>




این کد هم در مانیفست قرار دادم :



<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >

<receiver
android:name="mywidget" 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/widget_provider" />
</receiver>
<activity android:name=".ShowDifference" android:label="@string/app_name"/>
</application>




این کد هم لایوت ویجت هست :



<?xml version="1.0" encoding="utf-8"?>
<Button
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button1"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/app_name">

</Button>



با تشکر

Nevercom
دوشنبه 11 دی 1391, 03:17 صبح
من همین کدهای شما رو دقیقن کپی کردم و بدون مشکل اجرا شد
البته قطعاً فایل مانیفست فقط همون نیست و اون قسمت فقط مربوط به تگ application هست.

ضمن اینکه خط 26 و طبع اون خط 9 در کلاس mywidget نیاز نیست و من توی پروژه ی خودم ازش استفاده کردم و ارتباطی به ساخت ویجت نداره

programmer.net2009
دوشنبه 11 دی 1391, 12:36 عصر
ممنونم.... یه پروژه جدید ساختم با API کمتر، درست شد. اون موقه با API17 درست کرده بودم برای همین فکر کنم که تو android 4.0.4 کار نکرد. الان با API8 که نوشتم درست شد.

mehdilove09
پنج شنبه 29 مرداد 1394, 09:35 صبح
اگه بخوایم کاربر دوره زمانی آپدیت شدن رو انتخاب کنه چکار باید کرد؟

marvan021
پنج شنبه 29 مرداد 1394, 09:51 صبح
اگه بخوایم کاربر دوره زمانی آپدیت شدن رو انتخاب کنه چکار باید کرد؟
اینو تغییر بدهandroid:updatePeriodMillis="0"

marvan021
پنج شنبه 29 مرداد 1394, 09:53 صبح
اکه بخایم با کلیک رو ویجت ی موزیکو پخش کنیم..باید چیکار کرد؟؟؟؟؟!!!!

mehdilove09
پنج شنبه 29 مرداد 1394, 13:17 عصر
android:updatePeriodMillis="0"
اینو چطور میشه تو اکتیویتی فراخوند تا *کاربر* مقدارش رو وارد یا انتخاب کنه؟