2015-03-12 2 views
1

Мне нужно установить слушателя на кнопку, определенную в другом xml. Как мне это сделать? Я попробовал это, но это дает мне RunTimeException.Как получить доступ к элементам, определенным в другом XML?

super.onCreate(savedInstanceState); 
setContentView(R.layout.leavestatus_info_activity); 
cancel_leave_button = (Button)findViewById(R.layout.leave_status_reason).findViewById(R.id.cancel_leave); 

Вот мой LogCat:

03-12 11:36:19.125: E/AndroidRuntime(689): FATAL EXCEPTION: main 
03-12 11:36:19.125: E/AndroidRuntime(689): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.empover.hrms.activity/com.empover.hrms.activity.LeaveStatusInfoActivity}: java.lang.NullPointerException 
03-12 11:36:19.125: E/AndroidRuntime(689): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
03-12 11:36:19.125: E/AndroidRuntime(689): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
03-12 11:36:19.125: E/AndroidRuntime(689): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
03-12 11:36:19.125: E/AndroidRuntime(689): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
03-12 11:36:19.125: E/AndroidRuntime(689): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-12 11:36:19.125: E/AndroidRuntime(689): at android.os.Looper.loop(Looper.java:123) 
03-12 11:36:19.125: E/AndroidRuntime(689): at android.app.ActivityThread.main(ActivityThread.java:4627) 
03-12 11:36:19.125: E/AndroidRuntime(689): at java.lang.reflect.Method.invokeNative(Native Method) 
03-12 11:36:19.125: E/AndroidRuntime(689): at java.lang.reflect.Method.invoke(Method.java:521) 
03-12 11:36:19.125: E/AndroidRuntime(689): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
03-12 11:36:19.125: E/AndroidRuntime(689): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
03-12 11:36:19.125: E/AndroidRuntime(689): at dalvik.system.NativeStart.main(Native Method) 
03-12 11:36:19.125: E/AndroidRuntime(689): Caused by: java.lang.NullPointerException 
03-12 11:36:19.125: E/AndroidRuntime(689): at com.empover.hrms.activity.LeaveStatusInfoActivity.onCreate(LeaveStatusInfoActivity.java:61) 
03-12 11:36:19.125: E/AndroidRuntime(689): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
03-12 11:36:19.125: E/AndroidRuntime(689): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
03-12 11:36:19.125: E/AndroidRuntime(689): ... 11 more 
+0

Где находится ваш LogCat –

+0

@DonChakkappan Я отредактировал вопрос –

+0

что вы намерены получить кнопку в другом xml? Может быть, есть еще один способ получить то, что вы хотите ... – Opiatefuchs

ответ

1

Первый надуть другой макет, LayoutInflater.inflate(), а затем найти вид в InflatedLayout

cancel_leave_button = (Button)InflatedLayout.findViewById(R.id.cancel_leave); 
+0

Если вы попытаетесь сделать это в другом действии, будет выбрано исключение nullpointer, как это произошло в случае OP. Кнопка находится в другом xml и не связана с макетом, который установлен в активности ... – Opiatefuchs

+0

Ваше решение дает ошибку. –

2

Смотрите, если это работает:

setContentView(R.layout.first_layout); 
    View v = LayoutInflater.from(this).inflate(R.layout.second_layout, null); 

    Button b = (Button) v.findViewById(R.id.my_button); 
    b.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     } 
    }); 

То, что я здесь делаю, раздувает второй макет, прежде чем устанавливать на него прослушиватель onclick. В вашем коде, делая findViewById(R.layout.leave_status_reason).findViewById(R.id.cancel_leave);, происходит то, что вы смотрите в исходном макете для макета с именем leave_status_reason, которого не существует.

Редактировать Хорошо, это, вероятно, путь поздно, и вы, вероятно, перешли к настоящему времени, но я хочу, чтобы исправить это для потомков: чтобы получить эту работу, вам нужно заменить null с вашим контейнером макета родительского и вместо этого используйте View view. Таким образом, линия будет:

LinearLayout container = (LinearLayout) findViewById(R.id.first_layout); 

View view = View.inflate(this, R.layout.my_layout, container); 

, а затем оно должно работать.

+0

Ваше решение, похоже, сработало. Я т не дает какой-либо ошибки, но он не выполняет слушателя тоже .. :( –

+0

cancel_leave_button.setOnClickListener (новый OnClickListener() \t \t { \t \t \t @Override \t \t \t общественного недействительными OnClick (View v) \t \t \t { \t \t \t \t Toast.makeText (контекст, "кнопка нажата Отмена", Toast.LENGTH_SHORT) .show(); \t \t \t} \t \t}); –

+0

Право - честно говоря, я не был уверен, что это действительно исполнит слушателя. Лучшим методом было бы установить обратный вызов из Activity2 в Activity1, который сообщает Activity1 выполнять исполнитель (или что-то еще), когда Activity2 активирован. –

Смежные вопросы