جایگزین کلمه کلیدی this در فرگمنت ها
سلام
کلمه کلیدی this داخل فرگمنت ها عمل نمی کنه و خطا می ده
مثلا
tts = new TextToSpeech(this, this);
راهکاری که تو فروم های خارجی دیدم اینکه اول
یه Context تعریف کنیم بعد در متد onCreate
مقدار به این صورت تغییر بدیم
globalContext = this.getActivity();
و هر جا که لازم بود به جای this بنویسم globalContext
این کارو انجام دادم باز خطا داد ، راه حل چیه ؟
نقل قول: جایگزین کلمه کلیدی this در فرگمنت ها
توی هر فرگمنت یکسره بجای this بنویس getActivity() و خلاص
نقل قول: جایگزین کلمه کلیدی this در فرگمنت ها
نقل قول:
نوشته شده توسط
hosseinaryai
توی هر فرگمنت یکسره بجای this بنویس getActivity() و خلاص
getActivity تنها نه. درستش اینه
Activity thisActivity = FRAGMENTNAME.this.getActivity();
نقل قول: جایگزین کلمه کلیدی this در فرگمنت ها
نقل قول:
نوشته شده توسط
tux-world
getActivity تنها نه. درستش اینه
Activity thisActivity = FRAGMENTNAME.this.getActivity();
میشه یکم بیشتر توضیح بدی .. من الان تقریبن یک سال و نیمه دارم می زنم getActivity خالی و حتا یکبار هم ارور نگرفته .. خب منطقی هم هست ، getActivity داره ارجاش میده به اکتیویتی مادری که این فرگمنت روشه ..
دستوری که نوشتی چه مزیتی اضافی ای داره ؟
نقل قول: جایگزین کلمه کلیدی this در فرگمنت ها
نقل قول:
نوشته شده توسط
hosseinaryai
میشه یکم بیشتر توضیح بدی .. من الان تقریبن یک سال و نیمه دارم می زنم 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 ، اسم فرگمنتتون رو بنویسید .
نقل قول: جایگزین کلمه کلیدی this در فرگمنت ها
نقل قول:
نوشته شده توسط
NeoFighT
در بسیاری جاها هیچ فرقی با هم ندارن ، فرقشون رو با مثال زیر متوجه میشید :
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 .. همه جا هم جوابگو بوده واسم ..
نقل قول: جایگزین کلمه کلیدی this در فرگمنت ها
نقل قول:
نوشته شده توسط
hosseinaryai
خب موضوع اینجاست ، من اصلن از کلمه ی this استفاده نمی کنم .. فقط getActivity .. همه جا هم جوابگو بوده واسم ..
بازم فرقش تو مثالی که گفتم مشخص میشه ، وگرنه جاهای دیگه هیچ فرقی ندارن ،
شما مثال من رو تو برنامت پیاده کن متوجه میشی.
4 ضمیمه
نقل قول: جایگزین کلمه کلیدی this در فرگمنت ها
با احترام و تشکر ویژه از دوستان متاسفانه هیچ کدوم از کدوم هایی که گفتین کار نکرد ، فکر کنم دلیلش اینکه این فرگمنت ها به یه ViewPager
مرتبط هستن ، البته فکر نکنین این کدو فقط داخل همین متد تست کردم ، تو قسمت های دیگه مثل لیسنر و .. همین داستانه
ضمیمه 136680
ضمیمه 136681
ضمیمه 136682
ضمیمه 136683
نقل قول: جایگزین کلمه کلیدی this در فرگمنت ها
با این که تاپیک خیلی قدیمی هست و چون این مشکل دوستمون هم مثل من هستش و هنوز رفع نشده در ادامه همین تاپیک سوال رو مطرح میکنم
دوستان برای حل این مشکل باید چیکار کرد ؟ این دستور رو داخل کلاس اداپتور نوشتم.اینم کل کدهای کلاس اداپتور :
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);
}
}
نقل قول: جایگزین کلمه کلیدی this در فرگمنت ها
دوستان در مورد این مشکل راهنمایی نمیکنید:افسرده:
نقل قول: جایگزین کلمه کلیدی this در فرگمنت ها
اگه توضیحات 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 منتقل کنید.