View Full Version : جایگزین کلمه کلیدی this در فرگمنت ها
mr_ayma
چهارشنبه 20 آبان 1394, 15:49 عصر
سلام
کلمه کلیدی this داخل فرگمنت ها عمل نمی کنه و خطا می ده
مثلا
tts = new TextToSpeech(this, this);
راهکاری که تو فروم های خارجی دیدم اینکه اول
یه Context تعریف کنیم بعد در متد onCreate
مقدار به این صورت تغییر بدیم
globalContext = this.getActivity();
و هر جا که لازم بود به جای this بنویسم globalContext
این کارو انجام دادم باز خطا داد ، راه حل چیه ؟
hosseinaryai
چهارشنبه 20 آبان 1394, 18:46 عصر
توی هر فرگمنت یکسره بجای this بنویس getActivity() و خلاص
tux-world
چهارشنبه 20 آبان 1394, 22:29 عصر
توی هر فرگمنت یکسره بجای this بنویس getActivity() و خلاص
getActivity تنها نه. درستش اینه
Activity thisActivity = FRAGMENTNAME.this.getActivity();
hosseinaryai
پنج شنبه 21 آبان 1394, 07:05 صبح
getActivity تنها نه. درستش اینه
Activity thisActivity = FRAGMENTNAME.this.getActivity();
میشه یکم بیشتر توضیح بدی .. من الان تقریبن یک سال و نیمه دارم می زنم getActivity خالی و حتا یکبار هم ارور نگرفته .. خب منطقی هم هست ، getActivity داره ارجاش میده به اکتیویتی مادری که این فرگمنت روشه ..
دستوری که نوشتی چه مزیتی اضافی ای داره ؟
NeoFighT
پنج شنبه 21 آبان 1394, 07:46 صبح
میشه یکم بیشتر توضیح بدی .. من الان تقریبن یک سال و نیمه دارم می زنم getActivity خالی و حتا یکبار هم ارور نگرفته .. خب منطقی هم هست ، getActivity داره ارجاش میده به اکتیویتی مادری که این فرگمنت روشه ..
دستوری که نوشتی چه مزیتی اضافی ای داره ؟
در بسیاری جاها هیچ فرقی با هم ندارن ، فرقشون رو با مثال زیر متوجه میشید :
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// this.getActivity(); does not work
FragmentDrawer.this.getActivity();
}
});
مثلا ، داخل onClickListener شما نمیتونید از this.getActivity استفاده کنید و حتما باید قبل this ، اسم فرگمنتتون رو بنویسید .
hosseinaryai
پنج شنبه 21 آبان 1394, 08:33 صبح
در بسیاری جاها هیچ فرقی با هم ندارن ، فرقشون رو با مثال زیر متوجه میشید :
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// this.getActivity(); does not work
FragmentDrawer.this.getActivity();
}
});
مثلا ، داخل onClickListener شما نمیتونید از this.getActivity استفاده کنید و حتما باید قبل this ، اسم فرگمنتتون رو بنویسید .
خب موضوع اینجاست ، من اصلن از کلمه ی this استفاده نمی کنم .. فقط getActivity .. همه جا هم جوابگو بوده واسم ..
NeoFighT
پنج شنبه 21 آبان 1394, 08:37 صبح
خب موضوع اینجاست ، من اصلن از کلمه ی this استفاده نمی کنم .. فقط getActivity .. همه جا هم جوابگو بوده واسم ..
بازم فرقش تو مثالی که گفتم مشخص میشه ، وگرنه جاهای دیگه هیچ فرقی ندارن ،
شما مثال من رو تو برنامت پیاده کن متوجه میشی.
mr_ayma
پنج شنبه 21 آبان 1394, 12:15 عصر
با احترام و تشکر ویژه از دوستان متاسفانه هیچ کدوم از کدوم هایی که گفتین کار نکرد ، فکر کنم دلیلش اینکه این فرگمنت ها به یه ViewPager
مرتبط هستن ، البته فکر نکنین این کدو فقط داخل همین متد تست کردم ، تو قسمت های دیگه مثل لیسنر و .. همین داستانه
136680
136681
136682
136683
samiasoft
سه شنبه 29 خرداد 1397, 16:37 عصر
با این که تاپیک خیلی قدیمی هست و چون این مشکل دوستمون هم مثل من هستش و هنوز رفع نشده در ادامه همین تاپیک سوال رو مطرح میکنم
دوستان برای حل این مشکل باید چیکار کرد ؟ این دستور رو داخل کلاس اداپتور نوشتم.
http://s9.picofile.com/file/8329598900/2018_06_19_165611.jpg
http://s8.picofile.com/file/8329599234/tts2.jpg
اینم کل کدهای کلاس اداپتور :
import android.content.Context;
import android.speech.tts.TextToSpeech;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import java.util.Locale;
import io.github.meness.Library.Utils.IntentUtility;
public class adapter extends RecyclerView.Adapter<adapter.db_viewholder> {
List<civil> dic;
Context mContext;
public adapter(List<civil> dic, Context mContext) {
this.dic = dic;
this.mContext = mContext;
}
@NonNull
@Override
public db_viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R .layout.list_items,parent,false);
return new db_viewholder(view);
}
@Override
public void onBindViewHolder(@NonNull db_viewholder holder,final int position) {
civil civil = dic.get(position);
holder.txt_word.setText(civil.getWord());
holder.txt_meaning.setText(civil.getMeaning());
final String word = holder.txt_word.getText().toString();
holder.btn_volume.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TextToSpeech tts = new TextToSpeech(mContext,mContext);
tts.setLanguage(Locale.US);
tts.speak(word, TextToSpeech.QUEUE_ADD, null);
}
});
}
@Override
public int getItemCount() {
return dic.size();
}
public class db_viewholder extends RecyclerView.ViewHolder {
public TextView txt_word;
public TextView txt_meaning;
public RelativeLayout relativeLayout;
public Button btn_share;
public Button btn_copy;
public Button btn_volume;
public db_viewholder(View itemView) {
super(itemView);
txt_word=itemView.findViewById(R.id.txt_word);
txt_meaning=itemView.findViewById(R.id.txt_meaning );
txt_word.setTypeface(font.face);
txt_meaning.setTypeface(font.face);
relativeLayout=itemView.findViewById(R.id.relative Layout);
btn_share=itemView.findViewById(R.id.btn_share);
btn_copy=itemView.findViewById(R.id.btn_copy);
btn_volume=itemView.findViewById(R.id.btn_volume);
}
}
public void clear() {
final int size = dic.size();
dic.clear();
notifyItemRangeRemoved(0, size);
}
}
samiasoft
چهارشنبه 30 خرداد 1397, 14:28 عصر
دوستان در مورد این مشکل راهنمایی نمیکنید:افسرده:
Nevercom
پنج شنبه 31 خرداد 1397, 09:01 صبح
اگه توضیحات Constructor کلاس TextToSpeech رو ببینید، که عکس دومی هست که تو پست قبل گذاشتید، میبینید که توضیح داده که پارامتر اول از جنس Context باید باشه و پارامتر دوم از جنس OnInitListener.
برای پارامتر اول، وقتی در فرگمنت هستید با استفاده از متد getActivity میتونید به Context دسترسی پیدا کنید. اما برای پارامتر دوم باید یک Instance از اینترفیس OnInitListener بهش بدید.
TextToSpeech tts = new TextToSpeech(getActivity(), new TextToSpeech.OnInitListener() {
@Override
public void onInit(int i) {
}
});
ضمن اینکه بهتره در متد onBindViewHolder کار زیادی انجام ندید و onClickListener رو هم به کلاس db_viwholder منتقل کنید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.