findViewById для просмотра внутри включенного корневого элемента слияния - PullRequest
0 голосов
/ 05 мая 2018

Я хочу использовать представление в нескольких видах деятельности. В моем случае это 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, как уже упоминалось в комментариях, но это до сих пор не исправлено.

1 Ответ

0 голосов
/ 05 мая 2018

Вам не нужно устанавливать id для тега <include> или <merge>. Просто удалите его, а также findViewById(R.id.include_merge). Тег <merge> указывает, что все его представления добавляются в контейнер тега <include>. Таким образом, нет View с идентификатором, который вы ему установили. Но вы можете непосредственно найти FAB.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    fab = include_merge.findViewById(R.id.addBloodDonation);
}
...