В моем приложении у меня есть меню навигации, которое постоянно между действиями. Чтобы сделать мой код немного легче изменить, я превратил его в свой собственный xml и импортировал его мои макеты для каждого из моих экранов.
Чтобы настроить кнопки, я создал класс, в котором передаю текущую активность. У нового класса нет проблем с поиском мнений для кнопок, но он не может найти инкапсулирующий макет для меню и возвращает null при попытке findViewById()
. Поскольку кнопки и макет находятся в одном XML
public static void setup(Activity a){
myActivity = a;
//OFFENDING BIT OF CODE
View myLayout = (View) myActivity.findViewById(R.layout.navigation_bar);
Log.d(TAG, "layout: "+myLayout);
set_btn = (ImageButton) myActivity.findViewById(R.id.a_settings);
set_btn.setPressed(false);
set_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//TODO:
}
});
inbox_btn = (ImageButton) myActivity.findViewById(R.id.a_offers);
inbox_btn.setPressed(false);
inbox_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//TODO:
}
});
}
Основной экран XML
<RelativeLayout android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/navigationBar"
android:layout_alignParentBottom="true">
<include android:layout_height="wrap_content"
android:id="@+id/include1"
layout="@layout/navigation_bar"
android:layout_width="wrap_content"></include>
</RelativeLayout>
Меню XML
<RelativeLayout mlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/NavigationLayout">
<RelativeLayout android:id="@+id/buttonLayout"
android:layout_height="75dip"
android:layout_width="fill_parent"
android:layout_alignParentBottom="true">
<ImageButton android:id="@+id/a_settings"
android:layout_width="100dip"
android:background="@drawable/settings_button"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_height="fill_parent"
android:scaleType="fitXY">
</ImageButton>
<ImageButton android:id="@+id/a_wallet"
android:layout_width="100dip"
android:background="@drawable/wallet_button"
android:layout_toLeftOf="@+id/a_settings"
android:layout_alignBottom="@+id/a_settings"
android:layout_height="fill_parent"
android:scaleType="fitXY">
</ImageButton>
<ImageButton android:id="@+id/a_offers"
android:layout_width="100dip"
android:background="@drawable/offers_button"
android:layout_toRightOf="@+id/a_settings"
android:layout_alignBottom="@+id/a_settings"
android:layout_height="fill_parent"
android:scaleType="fitXY">
</ImageButton>
</RelativeLayout>
</RelativeLayout>
Несмотря на то, что ваш макет меню действительно называется navigation_bar
, вы указали в своем макете меню идентификатор include1
→ android:id="@+id/include1"
. Попробуйте findViewById(R.id.include1)
, если вы хотите разрешить его в своей деятельности (или просто попробуйте найти ImageButtons, они также видны).
Я не на 100%, но я выйду на конечность и скажу, что вам, вероятно, нужно будет называть findViewById() из вашего myLayout View (который может также иметь проблему кастинга).
Итак, вместо этого:
public static void setup(Activity a){
myActivity = a;
//OFFENDING BIT OF CODE
myLayout = (View) myActivity.findViewById(R.layout.navigation_bar);
Log.d(TAG, "layout: "+myLayout);
set_btn = (ImageButton) myLayout.findViewById(R.id.a_settings);
set_btn.setPressed(false);
set_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//TODO:
}
});
inbox_btn = (ImageButton) myLayout.findViewById(R.id.a_offers);
inbox_btn.setPressed(false);
inbox_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//TODO:
}
});
}