بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

روش ساخت ویکی Wiki ( چطور میشه  یک یا چند کلمه در متن رو به شکل لینک در آورد مثل ویکی ها  )؟

مدیریت گفتگو
نورحسینی 12 سال پیش
آخرین تغییر: 12 سال پیش

سلام دوستان یک برنامه دارم که میخام بعضی کلمات رو لینک کنم و وقتی روی اونها کلیک میشه بره تو صفحه مربوطه راهش چیه ممنون .

نظرات

sadeghbarout 12 سال پیش
مطمئنا یکی از راهها استفاده از html ه ولی خب منتظر راههای بهتر میمونیم :)
نورحسینی 12 سال پیش
ممنون آقا منظورت webview است ؟ مشکل عدم امکان تعویض فونتها در webview برطرف شد صادق جان ودر کل چه ایرادی ازش باقی مونده حل نشده ؟
sadeghbarout 12 سال پیش
اگه شما میتونی باهاش کنار بیای که مشکلی نداره خیلی هم خوبه. من به شخصه باهاش راحت نیستم . آخه یه جورایی کد تو کد میشه قاطی پاتی میشه!
نورحسینی 12 سال پیش
آقا این سوال بود علامت سوالش رو یادم رفت : مشکل عدم امکان تعویض فونتها در webview برطرف شد؟ ضمنا اصلا منظور شما از html همون webview ه یا چیز دیگه ؟ کس دیگه ای هم میدونه بگه ممنون .
نورحسینی 12 سال پیش
آقا اگر کسی میدونه لطفا جواب بده!
sadeghbarout 12 سال پیش
نه حتما webview نیست. میتونی html رو توی textview هم بذاری. بله مشکل فونت که حله. تو همون آموزش استاد هم فونت گفته شد به گمونم
MiRHaDi 12 سال پیش
من استفاده از a href و لینک دادن در webView را ترجیح میدهم

پاسخ‌ها 12

Spirit 12 سال پیش

این روش هم هست :

TextView tv = (TextView) findViewById(R.id.textView);
SpannableString text = new SpannableString(
"این سرویس صرفاً برای این سایت و توسط مدیریت سایت - بهنام آقاجانی ، برنامه نویسی شده است");
ClickableSpan clickfor = new ClickableSpan() {

@Override
public void onClick(View widget) {
Toast.makeText(widget.getContext(), "دانش آموخته از : دانشگاه آزاد اسلامي – واحد تهران مركز",
Toast.LENGTH_LONG).show();
}
};
text.setSpan(new URLSpan("http://uncocoder.com/"), 25,
29, 0);
text.setSpan(clickfor, 51, 64, 0);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setText(text, BufferType.SPANNABLE);

نظرات

Criss 12 سال پیش

متنی رو که میخای رو توی یک TextView بزار و برای اون تکست ویو SetOnClickListener تعریف کن بصورت زیر

من از این روش استفاده کردم

 

 txturl.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {

Intent myWebLink = new Intent(android.content.Intent.ACTION_VIEW);
myWebLink.setData(Uri.parse("http://answers.uncocoder.com/user/profile/2385"));
startActivity(myWebLink);

}
});

نظرات

نورحسینی 12 سال پیش
این خیلی جالب بود ولی وسط یک خط چطوری میشه یک textview رو بین دو کلمه قرار داد ؟ ممنون میشم راهش رو بگی ؟
نورحسینی 12 سال پیش
آقا کسی جوابی برای سوال بالا نداره ؟ ممنون
Criss 12 سال پیش
پروژه رو با وب ویو نوشتی یا دیتابیس؟
نورحسینی 12 سال پیش
من هنوز ننوشتم قربونت برم دارم بهترین راه رو پیدا می کنم . کل پروژه اینه که یک سری مطالب داریم که بعضی کلماتش مثل ویکی لینکه به صفحه همون مطلب که در عین حال اون صفحات پولی هم هست . حالا کلا برای اجرا نظر دوستان چیه ؟ ممنون میشم یک کم سریع تر بگید .
محمد حسین زاده 12 سال پیش

جواب S P ! R ! T عزیز مناسب و کامله - بهر حال یه سمپل هم میزارم

 public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

TextView textView=(TextView) findViewById(R.id.textView);

String term = "لینک";
String content = "سلام این یه لینکه که وسط متن ما اومده ! به افتخار این لینک وسط متن ما";

final Pattern p = Pattern.compile(term);
final Matcher matcher = p.matcher(content);
final SpannableStringBuilder spannable = new SpannableStringBuilder(content);

while (matcher.find()) {
spannable.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "لینکه کلیک شد!", Toast.LENGTH_LONG).show();
Log.i("PG","لینکه کلیک شد!");
}
},
matcher.start(), matcher.end(),
0);
}

textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(spannable,TextView.BufferType.SPANNABLE);
}
}

نظرات

نورحسینی 12 سال پیش

محمد جان خیلی ممنون از جواب خوبت . ولی سوال اینجاست که من چطور یک کلمه داخل یک فایل وردی رو  لینک کنم ؟

ببین در کد من nokat استرینگی هست که فایل وردی درش کپی شده.و این متن میخاد در txtmatn نمایش داده بشه . حالا در متن اون استرینگ بعضی از کلمات لینک باید بشن . حالا چه کار باید بکنم ؟

سوال دوم هم اینه که اون override سومی و inflate و ...که با ایجاد فایل جدید ایجاد میشه به چه درد میخوره ؟ ما اصلا تا آخر پروژه باهاش کار داریم یا نه ؟

ممنون از وتی که میزاری !

 
public class ActivityNokat extends Activity {



@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();

Intent intent = new Intent(ActivityNokat.this, ActivityIndex.class);
ActivityNokat.this.startActivity(intent);
ActivityNokat.this.finish();


}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.matn);










TextView txtmatn = (TextView) findViewById(R.id.txtmatn);

txtmatn.setText(getString(R.string.nokat));




}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

نظرات

نورحسینی 12 سال پیش
البته اگر دوستان دیگه هم میدونن دریغ نکنن . ممنون از همه .
نورحسینی 12 سال پیش

آقا یافتم من به این صورت حلش کردم الحمدلله. میزارم تا آیندگان استفاده کنند ساخت ویکی مدتها فکرم رو مشغول کرده بود اصلا فکرش رو نمیکردم توی ۱۰ دقیقه حل بشه . بازم ممنون از دوستان و spirit و بخصوص محمد عزیز .اما یک سوال دیگه هم پیش میاد که اگر ما چند عبارت رو بخایم لینک کنیم و مثلا term2 ,term3 ... چطور باید بنویسیم چون قبول نمیکنه که با هم در یک پرانتز باشند در 

      final Pattern p = Pattern.compile(term,term2,term3);

و اما جواب سوال دوم هنوز مجهوله .



@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();

Intent intent = new Intent(ActivityNokat.this, ActivityIndex.class);
ActivityNokat.this.startActivity(intent);
ActivityNokat.this.finish();



}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.matn);










TextView txtmatn = (TextView) findViewById(R.id.txtmatn);


//txtmatn.setText(getString(R.string.nokat));


//TextView textView=(TextView) findViewById(R.id.textView);

String term = "مهم";
String content = getString(R.string.nokat);

final Pattern p = Pattern.compile(term);
final Matcher matcher = p.matcher(content);
final SpannableStringBuilder spannable = new SpannableStringBuilder(content);

while (matcher.find()) {
spannable.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(ActivityNokat.this, "لینکه کلیک شد!", Toast.LENGTH_LONG).show();
Log.i("PG","لینکه کلیک شد!");
}
},
matcher.start(), matcher.end(),
0);
}

txtmatn.setMovementMethod(LinkMovementMethod.getInstance());
txtmatn.setText(spannable,TextView.BufferType.SPANNABLE);
}





@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}


نظرات

Spirit 12 سال پیش
سوال دوم : مربوط بهoptionMenu هستش اگه استفاده نمیکنی پاکش کن - سوال آخر : بستگی به ما هوش ما داره - ساده ترین حالت اینه که برای هر کلمه اون فرآیند تکرار بشه ( که البته به احتمال 99.9 درصد راه های بهتری هم هست که باید روش فکر کرد ( باید باهاش درگیر بشین ) )
MiRHaDi 12 سال پیش
شما همه کلمات "مهم" را لینک داده اید ولی ویکی اینجوری نیست و خودتون مشخص میکنید که چه کلمه ای لینک بخوره یا نخوره.
نورحسینی 12 سال پیش
سید جان راهش چیه خوب ؟ یک جایی انگار صحبت از webview کرده بودی نه ؟ کدش رو میزاری ؟ ممنون .
محمد حسین زاده 12 سال پیش

مهدی جان در مورد چند واژه پرسیده بودی - راهکار باز هم همینه

پیاده سازی دیگه به خودت بر میگرده - میخوای همه کلمات توی متنت لینک بشن - آیتم خاصی لینک بشه و ...

کد زیر رو تست کنی و با قبلی قیاس کنی تقریبا دستت میاد باید چه کنی

 
public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

TextView textView = (TextView) findViewById(R.id.textView);

Map<String, String> wikiItems = new HashMap<String, String>();

wikiItems.put("لینک", "لینک--");
wikiItems.put("متن", "متن--");
wikiItems.put("وسط", "وسط--");

String content = "سلام این یه لینکه که وسط متن ما اومده ! به افتخار این لینک وسط متن ما";

final SpannableStringBuilder spannable = new SpannableStringBuilder(content);

Iterator<Map.Entry<String, String>> it = wikiItems.entrySet().iterator();

while (it.hasNext()) {

final Map.Entry<String, String> entry = it.next();

int startIndex = content.indexOf(entry.getKey());

if (startIndex == -1) continue;

spannable.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {

Toast.makeText(MainActivity.this, entry.getValue(), Toast.LENGTH_LONG).show();
}
},
startIndex, startIndex + entry.getKey().length(),
0);
}

textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(spannable, TextView.BufferType.SPANNABLE);
}
}

نظرات

نورحسینی 12 سال پیش

ضمن تشکر از همه دوستان بحث ساخت ویکی داره کامل میشه .

من  کد رو وارد کردم و درست هم کار میکنه ولی مشکل اینجاست که اگر بخاهیم به جای toast در آن کلیک بنویسیم که با تاچ هر عبارت صفحه مربوط به همون عبارت باز بشه و مقدار معادلش که قبلا تعریف کردیم به نمایش در بیاد چجور باید بنویسیم ؟ من سعی کردم تا جا های خوبی هم رسیدم ولی کامل نشد کد رو میزارم براتون :

 
public class ActivityRizesh extends Activity {






@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();

Intent intent = new Intent(ActivityRizesh.this, ActivityIndex.class);
ActivityRizesh.this.startActivity(intent);
ActivityRizesh.this.finish();



}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.matn);


final TextView txtmatn = (TextView) findViewById(R.id.txtmatn);

Map<String, String> wikiItems = new HashMap<String, String>();

wikiItems.put("لینک", "متن معادل لینک");
wikiItems.put("متن", "متن معادل متن");
wikiItems.put("وسط", "متن معادل وسط");

String content = "سلام این یه لینکه که وسط متن ما اومده ! به افتخار این لینک وسط متن ما";

final SpannableStringBuilder spannable = new SpannableStringBuilder(content);

Iterator<Map.Entry<String, String>> it = wikiItems.entrySet().iterator();

while (it.hasNext()) {

final Map.Entry<String, String> entry = it.next();

int startIndex = content.indexOf(entry.getKey());

if (startIndex == -1) continue;

spannable.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {

//Toast.makeText(ActivityRizesh.this, entry.getValue(), Toast.LENGTH_LONG).show();


Intent intent = new Intent(ActivityRizesh.this, ActivityMatn.class);
ActivityRizesh.this.startActivity(intent);
ActivityRizesh.this.finish();


}
},
startIndex, startIndex + entry.getKey().length(),
0);
}

txtmatn.setMovementMethod(LinkMovementMethod.getInstance());
txtmatn.setText(spannable, TextView.BufferType.SPANNABLE);
}








@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

حالا در ActivityMatn با کد زیر نمیدونم چطور اون متن های معادل رو که در پرانتز ها آوردم باید صدا بزنم ولی این به ذهنم رسی که اگر متد entry.getValue() به صورت استاتیک نوشته بشه میشه اینجا صداش کرد و حل میشه :


public class ActivityMatn extends Activity {






@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();

Intent intent = new Intent(ActivityMatn.this, ActivityIndex.class);
ActivityMatn.this.startActivity(intent);
ActivityMatn.this.finish();



}


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.matn);


TextView txtmatn = (TextView) findViewById(R.id.txtmatn);
txtmatn.settext(entry.getValue());

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

اما در مورد راه حل پست قبلی که خیلی ساده تر بود من با تکرار همون پروسه لینک کردن فقط یک کلمه  خواستم که برای هر کلمه ای کد مجزا بنویسم اما نتیجه این شد که فقط یکی از کد ها رو ترتیب اثر داد ولینک کرد اینم کد مشکل چیه حالا؟


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.matn);


final TextView txtmatn = (TextView) findViewById(R.id.txtmatn);

//txtmatn.setText(getString(R.string.khoshki));

//TextView textView=(TextView) findViewById(R.id.textView);

String term = "قرص ویتامین";

String content = getString(R.string.rizesh);

final Pattern p = Pattern.compile(term);
final Matcher matcher = p.matcher(content);
final SpannableStringBuilder spannable = new SpannableStringBuilder(content);

while (matcher.find()) {
spannable.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(ActivityRizesh.this, "لینکه کلیک شد!", Toast.LENGTH_LONG).show();
Log.i("PG","لینکه کلیک شد!");
}
},
matcher.start(), matcher.end(),
0);
}

txtmatn.setMovementMethod(LinkMovementMethod.getInstance());
txtmatn.setText(spannable,TextView.BufferType.SPANNABLE);






String term2 = "عصاره ";

String content2 = getString(R.string.rizesh);

final Pattern p2 = Pattern.compile(term2);
final Matcher matcher2 = p2.matcher(content2);
final SpannableStringBuilder spannable2 = new SpannableStringBuilder(content2);

while (matcher2.find()) {
spannable2.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(ActivityRizesh.this, "لینکه کلیک شد!", Toast.LENGTH_LONG).show();
Log.i("PG","لینکه کلیک شد!");
}
},
matcher2.start(), matcher2.end(),
0);
}

 

 

نظرات

نورحسینی 12 سال پیش
دوستان و اساتید در مورد هر کدوم از راه حل های بالا نظری داشتند ممنون میشیم . کار گیره !
Spirit 12 سال پیش
در مورد مورد آخر > شما یکبار اون فرآیند رو انجام دادی و خروجیش رو دادی به TextView ، و بعد اون ، دوباره از اول همون کار رو کردی و همون طور رو هوا مونده ; شما باید خروجی فرآیند اول رو بدی به فرآیند دوم و در آخر بدی به TextView - به عنوان یک دوست کوچیک : جا داره مفاهیم جاوا رو بیشتر تمرین کنید :)
نورحسینی 12 سال پیش

ضمن تشکر از Sp!R!T عزیز که وقت میزاره من کد  رو اصلاح کردم یعنی settext رو اضافه کردم ولی نمیدونم چطوری باید خروجی فرآیند اول رو  به فرآیند دوم بدم  و در آخر بدم به TextView البته سعی کردم این کار رو بکنم و همه رو جمع کنم در Allspannables ولی ارور میده حالا راهش چیه ؟ ممنون

     
final TextView txtmatn = (TextView) findViewById(R.id.txtmatn);

//txtmatn.setText(getString(R.string.khoshki));

//TextView textView=(TextView) findViewById(R.id.textView);

String term = "قرص ویتامین";

String content = getString(R.string.rizesh);

final Pattern p = Pattern.compile(term);
final Matcher matcher = p.matcher(content);
final SpannableStringBuilder spannable = new SpannableStringBuilder(content);

while (matcher.find()) {
spannable.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(ActivityRizesh.this, "لینکه کلیک شد!", Toast.LENGTH_LONG).show();
Log.i("PG","لینکه کلیک شد!");
}
},
matcher.start(), matcher.end(),
0);
}

txtmatn.setMovementMethod(LinkMovementMethod.getInstance());
// txtmatn.setText(spannable,TextView.BufferType.SPANNABLE);






String term2 = "عصاره ";

String content2 = getString(R.string.rizesh);

final Pattern p2 = Pattern.compile(term2);
final Matcher matcher2 = p2.matcher(content2);
final SpannableStringBuilder spannable2 = new SpannableStringBuilder(content2);

while (matcher2.find()) {
spannable2.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(ActivityRizesh.this, "لینکه کلیک شد!", Toast.LENGTH_LONG).show();
Log.i("PG","لینکه کلیک شد!");
}
},
matcher2.start(), matcher2.end(),
0);
}
txtmatn.setMovementMethod(LinkMovementMethod.getInstance());
//txtmatn.setText(spannable2,TextView.BufferType.SPANNABLE);

/////////////
String term3 = "معجون";

String content3 = getString(R.string.rizesh);

final Pattern p3 = Pattern.compile(term3);
final Matcher matcher3 = p3.matcher(content3);
final SpannableStringBuilder spannable3 = new SpannableStringBuilder(content3);

while (matcher3.find()) {
spannable3.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(ActivityRizesh.this, "لینکه کلیک شد!", Toast.LENGTH_LONG).show();
Log.i("PG","لینکه کلیک شد!");
}
},
matcher3.start(), matcher3.end(),
0);
}
txtmatn.setMovementMethod(LinkMovementMethod.getInstance());
////////////////////

AllSpannables = spannable + spannable2 + spannable3;
txtmatn.setText(AllSpannables,TextView.BufferType.SPANNABLE);

نظرات

نورحسینی 12 سال پیش
لطفا اساتید تصحیح شده بخشی از کد رو زحمت بکشن و بزارن چون ممکنه با راهنمایی مطلب درست منتقل نشه . ممنون از لطف شما .
نورحسینی 12 سال پیش
آقا من حتی ۳ تا رو این طور هم جمع کردم و دیگه ارور نمیده ولی دیگه هیچ کدوم رو لینک نمیکنه . txtmatn.setText(spannable +""+ spannable2 +""+ spannable3 + "" ,TextView.BufferType.SPANNABLE);
نورحسینی 12 سال پیش

چون کدهای بالا درست نشون داده نشد یک بار دیگه ۲ تا راه دیگه رو هم که برای جمع کردن ۳ تاشون در یک تکست ویو  رفتم مینویسم که البته ناموفق بود بازم .

  
String AllSpannables = spannable +""+ spannable2 + spannable3;
txtmatn.setText(AllSpannables,TextView.BufferType.SPANNABLE);



و یا



//String AllSpannables = spannable +""+ spannable2 + spannable3;
txtmatn.setText(spannable +""+ spannable2 + spannable3,TextView.BufferType.SPANNABLE);







نظرات

مفهوم اسپن با چیزی که تو ذهنته متفاوته - اسپنی قابل کلیک روی یه رشته ایجاد میشه از اندیس a تا اندیس b
نورحسینی 12 سال پیش
ممنون محمد جان .کوتاه بود ولی نسبتا راهگشا .
نورحسینی 12 سال پیش

خوب با تشکر از دوستان .  بعد از کلی  انتظار کشیدن نه چندان مفید  و بعدش کلنجار رفتن با کد  از طریق شیوه آزمون و خطا و کمک های قبلی دوستان تونستم حلش کنم الحمدلله و الان دیگه خیلی نزدیک شده به شکل نهایی خودش فقط یک مشکلی هست و اون اینکه چون هر کاری کردم نتونستم با کلیک بر روی یک کلمه یک اکتیویتی جدا باز کنم ( یعنی کاری نداره ولی مشکل اینه که در اکتیویتی جدید همونطور که قبلا هم بالاتر نوشتم نمیدونم چطور میشه متن متناظر لینک رو در داخل تکست ویو انداخت) در نتیجه اومدم تکست ویوی همون صفحه ای که داخلش هستیم رو بدون اینکه یک صفحه جدید باز بشه دوباره ست تکست کردم . اینجا مشکل حل میشه ولی در برگشت با دکمه بک مکانیکی به مشکل بر میخوریم یعنی به دو مرحله قبل بر میگرده . اگر کسی بتونه راهنمایی کنه که چطوری من این دستور txtmatn.setText(entry.getValue()); رو در اکتیویتیه جدیدی که برای اون لینک باز میشه ست تکست کنم (چون در حالت معمول قبول نمیکنه ولی به نظرم اگر استاتیک نوشته بشه قابل صدا زدنه ولی من بلد نیستم چطوری! ) کلا مشکل من و هر کس دیگه ای که بعدا میاد حل میشه فقط اینکه بشه اون رو از اکتیویتی لینکها صدا زد  . ممنون .

 
public class ActivityRizesh extends Activity {











@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();

Intent intent = new Intent(ActivityRizesh.this, ActivityRizesh.class);
ActivityRizesh.this.startActivity(intent);
ActivityRizesh.this.finish();



}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.matn);


final TextView txtmatn = (TextView) findViewById(R.id.txtmatn);
final TextView txtback = (TextView) findViewById(R.id.txtback);



Map<String, String> wikiItems = new HashMap<String, String>();

wikiItems.put("لینک", "متن معادل لینک");
wikiItems.put("متن", "متن معادل متن");
wikiItems.put("وسط", "متن معادل وسط");

String content = "سلام این یه لینکه که وسط متن ما اومده ! به افتخار این لینک وسط متن ما";

final SpannableStringBuilder spannable = new SpannableStringBuilder(content);

Iterator<Map.Entry<String, String>> it = wikiItems.entrySet().iterator();

while (it.hasNext()) {

final Map.Entry<String, String> entry = it.next();

int startIndex = content.indexOf(entry.getKey());

if (startIndex == -1) continue;

spannable.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {

txtmatn.setText(entry.getValue());


}
},
startIndex, startIndex + entry.getKey().length(),
0);
}

txtmatn.setMovementMethod(LinkMovementMethod.getInstance());
txtmatn.setText(spannable, TextView.BufferType.SPANNABLE);





txtback.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(ActivityRizesh.this, ActivityIndex.class);
ActivityRizesh.this.startActivity(intent);
ActivityRizesh.this.finish();

}
});


}



}


 

نظرات

نورحسینی 12 سال پیش
همون طور که میبینید من یک دکمه بک نرم افزاری نوشتم ولی این راهش نیست و خودش مشکلاتی رو درست کرده برام . راهش همونه که در داخل onclick این صفحه اینتنت باز کردن صفحه جدید گذاشته بشه و در صفحه جدید هم txtmatn.setText(entry.getValue()); صدا زده بشه که کلا حل بشه . ممنون .
نورحسینی 12 سال پیش
دوستان کسی جواب رو نمیدونه ؟
دیالوگ هم جالب میشه برای ویکی - الزامی به اکتیویتی جدید که نیست؟
نورحسینی 12 سال پیش
حالا دیالوگ رو که تا حالا بهش فکر نکرده بودم و ممنون ولی در مورد سوال بالا آیا نمیشه همون setText(entry.getValue رو که کلید حل این ماجراست استاتیک نوشت که با همون اکتیویتی تمومش بکنیم ؟ راه اصلیش هم همونه ضمن اینکه ۹۵ درصد کارش حل شده قربونت برم اگر بتونی ۵ دقیقه از وقت شریفت رو به من بدی یک استاتیک میسازیم و تموم . اگر نشد دیگه باید برم شراغ دیالوگ ولی اون هم یک مشکلی که داره اینه که متن هر کدوم از لینکها خیلی طولانیه حتی بعضیش از خود این اکتیویتی طولانی تر به همین دلیل نمیخام تا مجبور نشدم برم سراغ دیالوگ . ممنون محمد جان دیگه آخراشه !
نورحسینی 12 سال پیش
البته اگر راه جدیدی به نظر دوستان برسه یا همون دیالوگ بتونه یک متن طولانی رو که گفتم از خود اکتیویتی اول بزرگتره ساپورت کنه اون راه میریم ولی خوب گفتم ۹۵ درصد این راه رو رفتیم ! ممنون از همه دوستانی که کمک می کنن.
MiRHaDi 12 سال پیش
شما میتونی برای دکمه بک کد بنویسی و خودش نره اکتیویتی قبل . بعد یک آرایه میذاری و هر دفعه که میری جلو یک خونه بهش اضافه میکنه و هر دفعه که میای عقب خونه آخر را بر میداری (استک) و حالت صفحه قبل شبیه سازی میشه تا جایی که برسی به اول استک ، اون موقع اکتیویتی قبلی را میاری
محمد حسین زاده 12 سال پیش

برای جلوگیری از دست به دامن استاتیک شدن میشه از یه دیالوگ استفاده کرد، البته امکانش به شرایط برنامه بر میگرده

کد مناسب دیالوگ برای اکتیویتی :

 public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

TextView textView = (TextView) findViewById(R.id.textView);
final WikiDialog wikiDialog = new WikiDialog(this);
Map<String, String> wikiItems = new HashMap<String, String>();

wikiItems.put("لینک", "لینک---");
wikiItems.put("متن", "متن--");
wikiItems.put("وسط", "وسط--");

String content = "سلام این یه لینکه که وسط متن ما اومده ! به افتخار این لینک وسط متن ما";
final SpannableStringBuilder spannable = new SpannableStringBuilder(content);

Iterator<Map.Entry<String, String>> it = wikiItems.entrySet().iterator();

while (it.hasNext()) {

final Map.Entry<String, String> entry = it.next();
int startIndex = content.indexOf(entry.getKey());
while (startIndex != -1) {
spannable.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {

wikiDialog.init(entry.getValue());
}
}, startIndex, startIndex + entry.getKey().length(), 0);

startIndex = content.indexOf(entry.getKey(), startIndex + 1);
}
}
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(spannable, TextView.BufferType.SPANNABLE);
}
}

نظرات

محمد حسین زاده 12 سال پیش

تو کد بالا از یه دیالوگ سفارشی استفاده شده که عنوان نداره - یه دکمه برای بستنش هست - محتویاتش اسکرول میشه , متنش قابل تغییره :

 public class WikiDialog extends Dialog {

private TextView textView;

public WikiDialog(Context context) {

super(context);
initialize();
}

public WikiDialog(Context context, int theme) {

super(context, theme);
initialize();
}

protected WikiDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {

super(context, cancelable, cancelListener);
initialize();
}

private void initialize() {
setCanceledOnTouchOutside(true);

textView = new TextView(G.context);
textView.setGravity(Gravity.CENTER);
textView.setTextColor(Color.BLACK);
textView.setLineSpacing(0, 1.5F);

Button button = new Button(G.context);
button.setText("بازگشت");
button.setTextColor(Color.WHITE);
button.setBackgroundColor(Color.GRAY);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});

LinearLayout linearLayout = new LinearLayout(G.context);
linearLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout.addView(textView);
linearLayout.addView(button);
linearLayout.setGravity(Gravity.CENTER);

ScrollView scrollView=new ScrollView(G.context);
scrollView.setPadding(30, 30, 30, 30);
scrollView.addView(linearLayout);
scrollView.setBackgroundColor(Color.WHITE);

getWindow().requestFeature(Window.FEATURE_NO_TITLE);
setContentView(scrollView);
}

public void init(String text) {
textView.setText(text);
show();
}
}

نظرات

نورحسینی 12 سال پیش
پس بالاخره مشکل ما رو حل کردی محمد جان ! دستت درد نکنه . خدا حفظت کنه قربونت برم . خوب دوستان دیگه ویکیمون از این روش تکمیل شد ولی اگر دوستان روش های دیگه ای هم دارن استقبال می کنیم و شیوه ای که بیشتر مورد استقبال خود من بشخصه هست همون باز کردن مطالب مربوط به لینک ها در یک اکتیویتی جداست که دستمون هم بازتر باشه . بزم ممنون محمد جان .
ولی مهدی جان برادرانه - این روش کار، خوب و مناسب نیست - اول برنامه نویس شو بعد برنامه بنویس. اینطوری برای هر پروژه ای تو یه چیزیش میمونی - ضمنا پروژه هات اصلا ساختار خوبی ندارن - 6 ماه میگذره واسه یکیشون بخوای آپدیت بدی کلا یادت میره چی به چی بوده
نورحسینی 12 سال پیش
ممنون از محمد عزیز و همین طور از ارزیابی پروژه با وجود مشغله های های زیادی که داره . ولی در لایه های زیرین کلامت کمی ناراحتی احساس میکنم !گفتم شاید بخاطر جمله ای باشه که بالا نوشتم ( پس بالاخره مشکل ما رو حل کردی محمد جان !) . ولی من واقعا تو رو دوست دارم خودت هم میدونی . اصلا ما چند نفر مثل تو توی ایران داریم که بیایم ناراحتشون هم بکنیم قربونت برم ؟ البته اگر ناراحت شده باشی ! ولی در هر صورت منظور من از جمله بالا این بود که بالاخره تنها کسی که تونست با پیگیری های مستمر تا آخر مشکل ما رو حل کنه تو بودی ! حد اقل تا این لحظه ! چون یکی دیگه از بچه ها هم داره روش کار میکنه . در مورد برنامه هم که خوب تو به عنوان یک برنامه نویس حرفه ای داری نگاه میکنی مسلما حرفت هم درسته ولی ما اوایل اندروید هستیم برادر ! ضمنا برای برنامه نویس شدن مگر راهی بهتر از برنامه نویسی و در دست گرفتن پروژه های واقعی و در گیر شدن در متن کار هم سراغ داری ؟ به نظرم بهترین و کوتاه ترین مسیر برای یادگیری شنا زدن به آبه و الا هیچ وقت تو ساحل نمیشه شنا یاد گرفت . در مورد اینی هم که گفتم من روش ساخت اکتویتی رو بیشتر می پسندم به این دلیله که اونطوری تمام صفحه میشه و برای متون طولانی بهترعمل میکنه و از همه قابلیتهای یک اکتیویتی که فراتر از دیالوگه میشه درش استفاده کرد ولی البته اگر بنا به استفاده از جملات کوتاه باشه روش شما خلاصه تر و بهتره . در هر صورت ما دوست داریمت محمد جان خیلی :)
نه مهدی جان لایه نداشت - چیزی هم که میگم وظیفس - ولی راه این نیست که برنامه بنویسی و پروژه واقعی دست بگیری - این 2 تا راهکار برای با تجربه شدنه - یعنی ساختار رو بلدی ، میشناسی حالا میای برای پخته شدن کد وارد یه پروژه میشی، کارشناسی ارشد الهیات داری منم با رشتت آشنا نیستم ولی خداییش تا مفاهیم پایه رو بلد نباشی میری سخنرانی کنی برای یه جمع؟ یا بلد بودی بعدش برای تسلط از جمع های آشنا و کوچیک شروع میکنی (شرمنده اگه مثالش به رشتت بی ربطه) - نظر من همیشه این بوده که تئوری رو باد بگیریم برای کسب تجربه پروژه دست بگیریم - در مورد روش هم بحثی نیست، اگه قرار باشه همه یه روش رو انتخاب کنن که همه برنامه های هم موضوع عین هم میشدن - مثل منم دست کم هزار تایی تو ایران هست - هنوز مونده تا یونیک بشیم :) خلاصه ارادتمندم و راضی نبودم اینهمه تایپ کنی هر جایی هم که مشکلی باشه در خدمتم !
نورحسینی 12 سال پیش
چون استاد شمایی حتما همینطوره دیگه ! ارادت از ماست .

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .