آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

java reflection - آموزش جدید

SeyyedH  9 سال پیش  8 سال پیش
0 0

سلام دوستان . مشکل من اینه که توی کلاس UAppcompatActivity، بلاک try  اجرا نمیشه، لاگ گرفتم و تا یک خط قبلش مشکلی نداره اما اون خط مشکل داره و وقتی هم میره توی catch  برنامه فورس کلوز میشه 

public class UAppCompatActivity extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
}

@Override
protected void onResume() {
super.onResume();

UBase.setCurrentActivity(this);
}


public static class Founder {
private final Activity activity;
private int[] features;
private boolean noTitlebar;
private boolean noActionbar;
private boolean fullscreen;
private int layoutId;
private Object ui;

public Founder(Activity activity) {
this.activity = activity;
}

public Founder requestFeatures(int... features) {
this.features = features;
return this;
}

public Founder noTitlebar() {
this.noTitlebar = true;
return this;
}

public Founder noActionbar() {
this.noActionbar = true;
return this;
}

public Founder fullscreen() {
this.fullscreen = true;
return this;
}

public Founder contentView(@LayoutRes int layoutResID) {
this.layoutId = layoutResID;
return this;
}

public Founder extractUi(Object ui) {
this.ui = ui;
return this;
}

public Founder build() {
for (int feature: this.features) {
activity.getWindow().requestFeature(feature);
}

if (noTitlebar) {
activity.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
}

if (fullscreen) {
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}

if (noActionbar) {
activity.getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

{
ActionBar actionBar = activity.getActionBar();
if (actionBar != null) {
actionBar.hide();
}
}

if (activity instanceof AppCompatActivity) {
AppCompatActivity castedActivity = (AppCompatActivity) activity;
android.support.v7.app.ActionBar actionBar = castedActivity.getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
}
}

activity.setContentView(layoutId);

// reflect ui elements

Class clazz = ui.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String name = field.getName();
Class type = field.getType();
if (name.contains("$")) {
continue;
}

int id = UBase.get().getResources().getIdentifier(name, "id", UBase.get().getPackageName());
try {
field.set(ui, activity.findViewById(id));

} catch (IllegalAccessException e) {
e.printStackTrace();

}
}


return this;
}
}
}

کد main activity:

public class MainActivity extends UAppCompatActivity {

private Ui ui;

private class Ui {
TextView txtview;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

ui = new Ui();

new Founder(this)
.requestFeatures()
.noTitlebar()
.noActionbar()
.fullscreen()
.contentView(R.layout.activity_main)
.extractUi(ui)
.build();

ui.txtview.setText("My Name is Hello World after Reflection!");
}
}

از این خط، خطای nullPointerException  میگیره

ui.txtview.setText("My Name is Hello World after Reflection!");

اینم خطی که تو کد اول اجرا نمیشه

            field.set(ui, activity.findViewById(id));
+1 0
سلام . من مشکلی که داشتم در name عبارت serialVersionUID نیز وجود داشت بررسی کنید اگر بود ("if(name.contains("$")||name.contains("serialVersionUID (9 سال پیش)
0 0
خب خطا که لاگ میشه رو بنویس ... راهنمایی بکنیم (9 سال پیش)
0 0
java.lang.RuntimeException: Unable to start activity ComponentInfo{ir.app.seyyedh.framework/ir.app.seyyedh.frameworkStartup.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference این خطا رو میده (9 سال پیش)
0 0
@mester_initialer نه حل نشد (9 سال پیش)
0 0
خب بالا هم گفته بودی که nullPointerException همین قسمت هم کپی کردی که ولی بهرحال چیزی که مشخص هست نمونه سازی انجام نمیشه و باید همونجا دنبالش بگردید ... اینجوری چیزی متوجه نشدم من... از اول اموزش رو برید شاید یه چیزی یادتون رفته باشه .... موفق باشید (9 سال پیش)
0 0
همین کار هم کردم و حتی خود کد های استاد رو کپی کردم اما باز هم این مشکل وجود داره (9 سال پیش)
0 0
عین همین خطارو منم داشتم، توی اندروید استادیو 2.1.2 این اشکال برام پیش نیومد اما به محض آپدیت، این ارور رو بهم داد. چندین بار امتحان کردم مشکل فک کنم از SDK و IDE هستش (8 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
سلطانی  9 سال پیش
+4 0

سلام، باید در حلقه ی for که field ها رو میخونیم در UAppCompatActivity به فیلد حق دسترسی بدین با خط کد زیر :

field.setAccessible(true);

یعنی قسمت مربوط به reflection بعد این تغییر این طوری میشه :

 
// reflect ui elements
{
Class clazz = this.ui.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
//خط زیر اضافه شده
field.setAccessible(true);
//
String name = field.getName();
Class type = field.getType();
if (name.contains("$")) {
continue;
}


int id = UBase.get().getResources().getIdentifier(name, "id", UBase.get().getPackageName());

try {
field.set(this.ui, activity.findViewById(id));
} catch (IllegalAccessException e) {
Log.i("LOG", "Error");
e.printStackTrace();
}
}
}
0 0
ممنون از راهنمایی شما مشکل بنده همانطور که @mester_initialer فرمودن از serialVersionUID بود که با راهنمایی ایشون رفع شد (8 سال پیش)

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