PDA

View Full Version : خواندن اطلاعات تکست ویو موجود در ویجت



abbasalim
پنج شنبه 21 فروردین 1393, 19:11 عصر
بنام خدا
سلام دوستان
من میخوام وقتی کاربربرروی دکمه ای کلیک میکنه (داخل ویجته ) اطلاعات تکست ویو موجود داخل ویجت( که نیم ساعت یه بار آپدیت میشه ) رو بخونه
طبق جستجویی هایی که داشتم اینکار شدنی نیست . آیا میشه نشه؟ میشه بشه؟ چجوری میشه؟:افسرده:


یه مثال توپ پیدا کردم که منظورم رو بهتر برسونه :
http://cafebazaar.ir/app/drioders.hafez/?l=fa

ببینید دکمه share داره این باید محتوا رو از کجا بفهمه چیه؟

smemamian
پنج شنبه 21 فروردین 1393, 20:13 عصر
وقتی اطلاعات از دیتابیس یا فایل خونده میشه، مکان اون نوشته قبل از نمایش، ذخیره می شود.
وقتی کلید Share انتخاب میشه، آخرین مکان نوشته در فایل یا دیتابیس در متغییری وجود داره
و باتوجه به اون متغییر، محتوای دیتابیس یا فایل انتقال داده میشه.

شما هم به همین صورت عمل کنید.

abbasalim
پنج شنبه 21 فروردین 1393, 21:18 عصر
وقتی اطلاعات از دیتابیس یا فایل خونده میشه، مکان اون نوشته قبل از نمایش، ذخیره می شود.
وقتی کلید Share انتخاب میشه، آخرین مکان نوشته در فایل یا دیتابیس در متغییری وجود داره
و باتوجه به اون متغییر، محتوای دیتابیس یا فایل انتقال داده میشه.

شما هم به همین صورت عمل کنید.
مشکل من اینه که من شی رو از دیتابیس میخونم و نمایش میدم ولی بعد که کاربر کلیک میکنه شی به صورت null شناخته میشه :ناراحت:


import ir.esfandune.database.DBAdapter;
import ir.esfandune.database.Mokhatab;

import java.util.Arrays;
import java.util.Random;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;

public class Widget extends AppWidgetProvider {

public static String WIDGET_BUTTON = "ir.esfandune.ahadis.btn_fav";
public static String SHOW_BUTTON = "ir.esfandune.ahadis.btn_show";
Mokhatab mokhatab = new Mokhatab() ;
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;

Log.i("ahadis", "Updating widgets " + Arrays.asList(appWidgetIds));
DBAdapter db = new DBAdapter(context);
db.open();




for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];


RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.zaher);
int size =db.getAllContacts("contacts").size();
if( size==0){
Log.i("ahadis", "contacts<0");
//kar namokone :D:-??
views.setTextViewText(R.id.txt_from, "هشدار:");
views.setTextViewText(R.id.txt_hadis, "لطفا برای دفعه اول یک بار وارد برنامه شوید و بعد ویجت را برروی صفحه بکشید");
views.setTextViewText(R.id.txt_manba, "با تشکر");

}else{
Random r = new Random();
mokhatab =db.getContact(r.nextInt(size)+1, "contacts");
views.setTextViewText(R.id.txt_from, mokhatab.getname());
views.setTextViewText(R.id.txt_hadis, mokhatab.getHadis());
views.setTextViewText(R.id.txt_manba, mokhatab.getManba());
}
Random r = new Random();
int a = r.nextInt(2);
if(a==0){
views.setImageViewResource(R.id.ax_chand, R.drawable.bgpayzz);
}
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT,mokhatab.ge tname()+"\n"+mokhatab.getHadis()+"\n"+mokhatab.getManba());
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "حدیث");
PendingIntent PendingsIntent = PendingIntent.getActivity(context, 0, Intent.createChooser(shareIntent , "به اشتراک بگذارید با:"), 0);
views.setOnClickPendingIntent(R.id.ic_name, PendingsIntent);

/*
Intent openIntent = new Intent(context,ShowHadis.class);
openIntent.putExtra(".matbakh.Food", mokhatab);
PendingIntent PendingopenIntent = PendingIntent.getActivity(context, 0, openIntent, 0);
views.setOnClickPendingIntent(R.id.ic_max, PendingopenIntent);

*/
Intent intent = new Intent(WIDGET_BUTTON);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.ic_ghalb, pendingIntent );
///
Intent showintent = new Intent(SHOW_BUTTON);
PendingIntent showpendingIntent = PendingIntent.getBroadcast(context, 0, showintent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.ic_max, showpendingIntent );

appWidgetManager.updateAppWidget(appWidgetId, views);
}
db.close();
}

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
super.onReceive(context, intent);
if (WIDGET_BUTTON.equals(intent.getAction())) {
DBAdapter db = new DBAdapter(context);
db.open();

if(db.findContacts(mokhatab.getHadis(), "favs").size()==0){
db.insertContact(mokhatab);
Toast.makeText(context, "به لیست علاقه ها (♥) اضافه شد", Toast.LENGTH_SHORT).show();
}else{
db.deleteContact(mokhatab.getHadis(), "favs");
Toast.makeText(context, "از لیست علاقه ها (♥) حذف شد", Toast.LENGTH_SHORT).show();
}
Log.i("esfandune", mokhatab.getname()+"fav shod");
db.close();
}
if(SHOW_BUTTON.equals(intent.getAction())){
Toast.makeText(context, "kelikidim", Toast.LENGTH_SHORT).show();

Intent i = new Intent(context,ShowHadis.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Log.i("esfandune", "inja tu widget: "+mokhatab.getname());
i.putExtra(".matbakh.Food", mokhatab);
context.startActivity(i);


/*
Intent openIntent = new Intent(context,ShowHadis.class);
openIntent.putExtra(".matbakh.Food", mokhatab);
PendingIntent PendingopenIntent = PendingIntent.getActivity(context, 0, openIntent, 0);


}
}


@Override
public void onDeleted(Context context, int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onDeleted(context, appWidgetIds);
Toast.makeText(context, "www.esfandune.ir", Toast.LENGTH_SHORT).show();
}
@Override
public void onEnabled(Context context) {
Toast.makeText(context, "ویجت دارای مشکلاتی می باشد.\nلطفا تا ارائه نسخه جدید شکیبا باشید.", Toast.LENGTH_SHORT).show();

super.onEnabled(context);
}
}

#root#
پنج شنبه 21 فروردین 1393, 21:31 عصر
ببینید این جوری میشه ، خودم توی یه برنامه اینجوری کار کردم :
وقتی ویجت بروز میشه اون ردیفی که اطلاعاتش خونده میشه به احتمال زیاد یه id تو دیتابیس داره دیگه ، اون id رو هونجا بگیر و با sharedPreference ذخیره کن ، موقع اشتراک گزاری یه نمونه جدید از دیتابیس بساز و با توجه به اون id ذخیره شده اطلاعات مورد نظرت رو از دیتابیس بگیر.

abbasalim
پنج شنبه 21 فروردین 1393, 21:35 عصر
ببینید این جوری میشه ، خودم توی یه برنامه اینجوری کار کردم :
وقتی ویجت بروز میشه اون ردیفی که اطلاعاتش خونده میشه به احتمال زیاد یه id تو دیتابیس داره دیگه ، اون id رو هونجا بگیر و با sharedPreference ذخیره کن ، موقع اشتراک گزاری یه نمونه جدید از دیتابیس بساز و با توجه به اون id ذخیره شده اطلاعات مورد نظرت رو از دیتابیس بگیر.
اره این ایده خوبیه اینجا هم ذکر کرده:
http://stackoverflow.com/questions/8857368/android-get-textview-value-inside-widget/8859070#8859070
ولی راه درست تری باید وجود داشته باشه:متفکر:

abbasalim
یک شنبه 24 فروردین 1393, 10:57 صبح
ببینید این جوری میشه ، خودم توی یه برنامه اینجوری کار کردم :
وقتی ویجت بروز میشه اون ردیفی که اطلاعاتش خونده میشه به احتمال زیاد یه id تو دیتابیس داره دیگه ، اون id رو هونجا بگیر و با sharedPreference ذخیره کن ، موقع اشتراک گزاری یه نمونه جدید از دیتابیس بساز و با توجه به اون id ذخیره شده اطلاعات مورد نظرت رو از دیتابیس بگیر.
اگه چندتا ویجت رو بزاره رو صفحه چی میشه؟ هرکدوم محتوای خاص دارن ولی داخل sharedPreference فقط یه محتوا هست :ناراحت:

#root#
یک شنبه 24 فروردین 1393, 11:04 صبح
اگه چندتا ویجت رو بزاره رو صفحه چی میشه؟ هرکدوم محتوای خاص دارن ولی داخل sharedPreference فقط یه محتوا هست :ناراحت:
خودم هم لازم دارم ، ببین اگه کار کرد به ما هم بگو

http://stackoverflow.com/questions/14582395/handling-multiple-instances-of-appwidget

این آسونرته :

http://stackoverflow.com/questions/12962524/add-several-appwidgets-with-different-configuration

abbasalim
یک شنبه 24 فروردین 1393, 13:09 عصر
طبق این سه لینک آخر مشکلها حل میشه اگه این مشکلم حل بشه که چطور وقتی کاربر برروی دکمه ای کلیک کرد APPwidgetid ایش رو بگیرم
آخه id آخرین ویجتی که گذاشتم به دست میاد تو گرفتن id ویجت ها برای نمایش موندم :ناراحت: اینجا :
http://stackoverflow.com/questions/8857368/android-get-textview-value-inside-widget/8859070#8859070
برای هر ویجتی مشخصات پرفرنس رو آپدیت میکنه ولی برای فراخوانی باید چیکار کرد ؟