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

Annotation چیست؟ چه کاربردهایی دارد و چطور یک Annotation اختصاصی بنویسیم؟

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

سلام

تیتر سئوالم خیلی واضحه، میخواستم بدونم Annotation چیه و چه کاربردهایی داره و چطور میتونیم یه Annotation اختصاصی بنویسیم.

باتشکر

نظرات

Ali 11 سال پیش
خیلی ممنون، این لینک رو قبلا دیده بودم ولی متاسفانه اونطور که باید درکش نکردم:( دلم میخواد با استفاده از Annotation، ویوها رو به کلاس بشناسونم یا به جای نوشتن متد onClickListener یا متدهای دیگه از Annotationها استفاده کنم؛ البته کتابخونه‌های بسیار جالبی وجود دارند که این کارها رو انجام میدند اما فکر کنم نوشتنش کار بسیار جالبتر و هیجان انگیزتری باشه:) راستی انجمن یه تاپیک هم در این مورد نداره، امیدوارم دوستان و اساتید بزرگوار یاری کنند تا این موضوع هم روشن بشه.
Ali 11 سال پیش
کتابخونه‌هایی که گفتم لینک و لینک هستند که به نظر بیشتر به عنوان framework مطرح میشند. امیدوارم براتون مفید باشه :)
javac 11 سال پیش
این مورد ، شناسوندن ویوها رو اتفاقا استاد تدریس کردند
Ali 11 سال پیش
تدریس کردند اما باید یه کلاس دیگه توی کلاس اصلیمون بسازیم و ویوها رو اونجا تعریف کنیم اما با استفاده از Annotation کافی یه خط بنویسیم برای مثال: ;ViewById TextView txt@ البته فکر کنم برای انجام اینکار باید از همون کدها استفاده کنیم با این تفاوت که اینبار به جای استفاده از کلاس HelperUi از یه Annotation اختصاصی که تقریبا حاوی همون کدهاست استفاده میکنیم. اما اینها رو حدسی گفتم چون چیز زیادی از ساختن و استفاده کردن از Annotation اختصاصی نمیدونم :)

پاسخ‌ها 1

Ali 11 سال پیش

سلام
بالاخره تونستم اون کاری که استاد توی ویدئوی ' استفاده از Java Reflection' انجام میدادند رو به شکل دیگری انجام بدم البته اصلش یکیه :


کلاس ActivityMain :

 public class ActivityMain extends Activity {

@MyViewById
public TextView txt;

@MyViewById
public Button btn;

@MyViewById
public EditText edt;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

new Helper(getWindow().getDecorView(), ActivityMain.this);

btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if ( !edt.getText().toString().matches("")) {
txt.setText(edt.getText().toString());
} else {
txt.setText("...");
}
}
});
}
}

main.xml :

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#444"
android:gravity="center"
android:orientation="vertical"
android:padding="24dp" >

<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>

<TextView
android:id="@+id/txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="24dp"
android:gravity="center"
android:text="Hi!"
android:textColor="#FFF"
android:textSize="18dp" />

<Button
android:id="@+id/btn"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:text="Click Me!" />

</LinearLayout>

کلاس G :

 public class G extends Application {

public static Resources resources;
public static String packageName;

@Override
public void onCreate() {
super.onCreate();
resources = getResources();
packageName = getPackageName();
}
}

انوتیشن MyViewById که توی یه کلاس جداگونه قرارش دادم :

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyViewById {}

کلاس Helper :

 public class Helper {

public Helper(View decorView, Context context) {
try {
for (Field field: context.getClass()
.getClassLoader()
.loadClass(context.getClass().getName())
.getFields()) {
if (field.isAnnotationPresent(MyViewById.class)) {
try {
int id = G.resources.getIdentifier(field.getName(), "id", G.packageName);
field.set(context, field.getType().cast(decorView.findViewById(id)));
}
catch (Throwable e) {
e.printStackTrace();
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}

امیدوارم براتون مفید باشه. (خودم که خیلی حال کردم :) )
خیلی ممنون میشم اگه دوستان و اساتید راهنمایی کنند تا این مبحث کاملتر و بهتر توضیح داده بشه.

نظرات


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