Я хочу использовать представление в нескольких видах деятельности. В моем случае это FloatingActionButton. В тот момент, когда я ищу представление через findViewById, программа выдает NullPointerException . Как мне получить доступ к FloatingActionButton?
Поскольку кнопка всегда должна быть одинаковой, я создал XML-макет, включающий только FloatingActionButton внутри корневого элемента merge
, чтобы уменьшить накладные расходы при использовании ìnclude
.
floating_button.xml
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/include_merge" >
<android.support.design.widget.FloatingActionButton
android:id="@+id/addBloodDonation"/>
</merge>
Чтобы использовать это в других моих XML-макетах, я использую тег include
XML Activitiy Layouts, которые должны include
FloatingActionButton
<include
android:id="@+id/include_merge"
layout="@layout/floating_button" />
Пока это работает.
Чтобы иметь одинаковую функциональность во всех моих действиях, я создал BaseActivity, от которого наследуются мои другие классы, например, моя основная деятельность.
BaseActivity
public abstract class BaseActivity extends AppCompatActivity {
public FloatingActionButton fab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View include_merge = findViewById(R.id.include_merge);
fab = include_merge.findViewById(R.id.addBloodDonation);
}
}
MainActivity (в качестве примера)
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
При запуске приложения я получаю NullPointerException в BaseActivity за попытку найти внутренний элемент, так как переменная View include_merge равна нулю.
Когда я читаю здесь , тег include
и корневой элемент должны иметь одинаковые android:id
. Есть ли разница при использовании merge
в качестве корневого элемента? И возможно ли даже преобразовать тег merge
в View.
Нужно ли использовать setContentView в BaseActivity, так как его метод onCreate вызывается перед методом MainActivity?
Edit:
Добавлен setContentView(R.layout.activity_main);
к BaseActivity, как уже упоминалось в комментариях, но это до сих пор не исправлено.