Как получить доступ к кнопке внутри моего макета Header.xml из моей MainActivity?

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить доступ к кнопке, которая находится внутри моего файла макета xml заголовка, непосредственно из моей MainActivity. Приложение вылетает каждый раз, когда я его запускаю.

Я продолжаю получать точку NullPointerException:

MainActivity.onCreate(MainActivity.java:125)

Что это за строка кода:

mButtonHeader.setOnClickListener(new View.OnClickListener() {

Как мне получить доступ к кнопке и установить для нее onClick(), чтобы сделать ее доступной?

Мой макет заголовка:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="190dp"
android:background="#ffffff"
android:orientation="vertical"
android:id="@+id/myHeader">
<!--android:background="@drawable/background_material_original"-->

<Button
    android:id="@+id/buttonHeader"
    android:layout_width="match_parent"
    android:layout_height="190dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:alpha="0.0"
    android:clickable="true"
    android:enabled="true"
     /> 

 </RelativeLayout>

Мой XML-файл макета MainActivity:

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_home"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include
        android:id="@+id/toolbar"
        layout="@layout/tool_bar" />

    <ImageView
        android:id="@+id/imageViewHomeBackgroundPic"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar"
        android:layout_marginTop="0dp"
        android:background="@drawable/homebp"
        android:contentDescription="@string/home_bp"/>

    <TextView
        android:id="@+id/mId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

 </RelativeLayout>


<android.support.design.widget.NavigationView
    android:id="@+id/navigation_view"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#fff"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/header"
    app:menu="@menu/menu_drawer_home"
    />


</android.support.v4.widget.DrawerLayout>

Мой класс MainActivity:

public class MainActivity extends AppCompatActivity{

  protected Toolbar toolbar;
  protected NavigationView navigationView;
  private DrawerLayout drawerLayout;
  protected Button mButtonHeader;


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    //Calling method of my navigation drawer
    setupNavViewDrawer();

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


            Uri uri = Uri.parse("http://www.google.com/"); 
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
        }
    });



   }
}

Моя ошибка logcat:

    10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime: FATAL EXCEPTION: main
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime: Process: com.pi.cas.ndtc, PID: 14553
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pi.cas.ndtc/com.pi.cas.ndtc.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:151)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5257)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at com.pi.cas.ndtc.MainActivity.onCreate(MainActivity.java:125)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5990)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5257) 
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
10-31 20:48:05.342 14553-14553/com.pi.cas.ndtc E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

person Equivocal    schedule 01.11.2015    source источник
comment
Ваш макет заголовка называется tool_bar? Просто не похоже, что вы правильно подключили xml ко мне.   -  person alphanumeric character    schedule 01.11.2015
comment
tool_bar — это отдельный макет, в котором я определил, какой должна быть панель инструментов. Я предполагаю, что панель инструментов не имеет ничего общего с текущей проблемой   -  person Equivocal    schedule 01.11.2015
comment
то есть ваша проблема прямо там. XML-файл MainActivity ссылается на tool_bar через include, но не на XML-файл, содержащий заголовок. Импортируйте этого парня, и он должен работать.   -  person alphanumeric character    schedule 01.11.2015


Ответы (3)


включите файл макета заголовка в свой файл activity_main.xml

<android.support.v4.widget.DrawerLayout ....>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include
        android:id="@+id/toolbar"
        layout="@layout/tool_bar" />

    ....

 </RelativeLayout>


<android.support.design.widget.NavigationView
    ...

<include
        layout="@layout/header" />

</android.support.v4.widget.DrawerLayout>
person Bhargav Thanki    schedule 01.11.2015
comment
Если я включу заголовок в основное действие, вы понимаете, что заголовок будет постоянно отображаться на экране... - person Equivocal; 01.11.2015
comment
Заголовок должен находиться внутри представления навигации, чтобы вы могли видеть его, когда он открывается, но если я сделаю то, что вы предлагаете, то все мои представления внутри макета заголовка будут постоянно отображаться на главной странице. - person Equivocal; 01.11.2015
comment
Это именно то, что я только что сказал. Вы ДОЛЖНЫ загрузить представление, прежде чем сможете найти на нем ViewById. - person alphanumeric character; 01.11.2015
comment
Если вам нужен заголовок для навигационного ящика, вы можете поместить тег include для макета заголовка внутри NavigationView. - person Bhargav Thanki; 01.11.2015
comment
Теперь это было более конкретно. Ваше предыдущее предложение заставило бы все содержимое отображаться в домашней (основной) активности. - person Equivocal; 01.11.2015

Вы не включаете XML, содержащий кнопку, которую вы пытаетесь найти в XML MainActivity. Попробуйте включить это, и все должно начать работать немного лучше.

Изменить для ясности:

Вы ДОЛЖНЫ загрузить XML, содержащий кнопку, прежде чем вы сможете вызвать findViewById и получить кнопку обратно. В настоящее время ваш код не загружается и, следовательно, никогда не будет найден, и вы всегда будете получать NPE, когда пытаетесь вызвать какие-либо вызовы методов после findViewById.

Конкретно:

<android.support.design.widget.NavigationView
    android:id="@+id/navigation_view"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#fff"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/header"
    app:menu="@menu/menu_drawer_home">
*** <include layout="@layout/header" /> ***
</android.support.design.widget.NavigationView>
person alphanumeric character    schedule 01.11.2015
comment
Зачем мне включать макет заголовка в макет MainActivity? - person Equivocal; 01.11.2015
comment
Это приведет к тому, что все представления внутри макета заголовка будут отображаться поверх моего содержимого в основном действии... Заголовок должен находиться только внутри представления навигации. - person Equivocal; 01.11.2015
comment
Независимо от того, где она находится, вам нужно загрузить ресурс, содержащий кнопку, прежде чем вы сможете вызвать findViewById. Поскольку вы не включили достаточно кода, чтобы полностью показать структуру вашего экрана, я ответил как можно лучше с предоставленной информацией. - person alphanumeric character; 01.11.2015
comment
Кроме того, мой ответ остается в силе: вы не загрузили файл, содержащий buttonHeader, прежде чем пытаться получить к нему доступ. Вам нужно загрузить этот XML, чтобы findViewById работал. Период. - person alphanumeric character; 01.11.2015

Это действительно поздний ответ, но, возможно, он может помочь другим парням, у которых возникла эта проблема.

Вам нужно изменить коды activity_main.xml следующим образом: удалите это в activity_main: app:headerLayout="@layout/header"

и включить макет заголовка. Как это:

из

<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#fff"
android:fitsSystemWindows="true"
app:headerLayout="@layout/header"
app:menu="@menu/menu_drawer_home"/>

to

<android.support.design.widget.NavigationView
    android:id="@+id/navigation_view"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#fff"
    android:fitsSystemWindows="true"

    app:menu="@menu/menu_drawer_home"

 <include 
     layout="@layout/header"
     android:layout_width="match_parent"
     android:layout_height="190dp" />
</android.support.design.widget.NavigationView>
person yuspacex    schedule 02.08.2019