Кнопка Onclick Sulderer в включенные макеты
-
29-09-2019 - |
Вопрос
Я прихожу к вам на согнутом колене, вопрос в руке. Я относительно новичок в Android, так что простите любые кощунственные вещи, которые я мог бы сказать.
Вступление: У меня есть несколько макетов в приложении, которые все должны включать в себя обычный нижний колонтитул. У этого нижнего колонтитула есть несколько важных кнопок для возвращения на домашнюю страницу, выйти из строя и т. Д.
Мне удалось заставить этот нижний колонтитул появиться на всех необходимых страницах с помощью тегов включения и слияния. Проблема заключается в определении на щелчке слушателей для всех кнопок. Хотя я могу определить слушателей во всех действиях, связанных с экранами, которые включают макет нижнего колонтитула, я считаю, что это становится ужасно утомительным, когда увеличивается количество экранов.
Мой вопрос: Могу ли я определить кнопку нажатия прослушивателя, которая будет работать через приложение, к которому можно получить доступ с любого экрана с использованием Android: Onclick Атрибут кнопки?
То есть я хотел бы определить кнопку, нажмите «Слушатель один раз», в отдельном классе, скажем LOTECLICKLISTENERS, и просто назовите этот класс как класс слушателя для любого нажатия кнопки на нижнем колонтитуле. Идея состоит в том, чтобы сделать единственную точку доступа для кода слушателя, чтобы любые изменения для упомянутых слушателей были отражены на протяжении всего приложения.
Решение
У меня была та же проблема с меню, которое я использовал в нескольких макетах. Я решил проблему, надув макет XML -файл в класс, расширяющий RELATIVELAYOUT, где я затем определил OnClickListener. После этого я включил класс в каждый макет, требующий меню. Код выглядел так:
Menu.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageButton android:id="@+id/map_view"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:src="@drawable/button_menu_map_view"
android:background="@null"
android:scaleType="fitCenter"
android:layout_height="@dimen/icon_size"
android:layout_width="@dimen/icon_size">
</ImageButton>
<ImageButton android:id="@+id/live_view"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:src="@drawable/button_menu_live_view"
android:background="@null"
android:scaleType="fitCenter"
android:layout_height="@dimen/icon_size"
android:layout_width="@dimen/icon_size">
</ImageButton>
<ImageButton android:id="@+id/screenshot"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:src="@drawable/button_menu_screenshot"
android:background="@null"
android:scaleType="fitCenter"
android:layout_height="@dimen/icon_size"
android:layout_width="@dimen/icon_size">
</ImageButton>
</merge>
Menuview.java
public class MenuView extends RelativeLayout {
private LayoutInflater inflater;
public MenuView(Context context, AttributeSet attrs) {
super(context, attrs);
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.menu, this, true);
((ImageButton)this.findViewById(R.id.screenshot)).setOnClickListener(screenshotOnClickListener);
((ImageButton)this.findViewById(R.id.live_view)).setOnClickListener(liveViewOnClickListener);
((ImageButton)this.findViewById(R.id.map_view)).setOnClickListener(mapViewOnClickListener);
}
private OnClickListener screenshotOnClickListener = new OnClickListener() {
public void onClick(View v) {
getContext().startActivity(new Intent(getContext(), ScreenshotActivity.class));
}
};
private OnClickListener liveViewOnClickListener = new OnClickListener() {
public void onClick(View v) {
getContext().startActivity(new Intent(getContext(), LiveViewActivity.class));
}
};
private OnClickListener mapViewOnClickListener = new OnClickListener() {
public void onClick(View v) {
getContext().startActivity(new Intent(getContext(), MapViewActivity.class));
}
};
}
Mayout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView android:id="@+id/surface"
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="fill_parent">
</SurfaceView>
<!-- some more tags... -->
<com.example.inflating.MenuView
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
с <com.example.inflating.MenuView />
Тег, теперь вы можете повторно использовать свой самопрорастающий макет (включая OnclickListener) в других макетах.
Другие советы
Это то, что добавляется в Roboguice в ближайшем будущем. Это позволит вам создавать классы контроллера для таких вещей, как Titlebar's и нижние колонтитулы, и вы можете создать для вас события.
Проверить http://code.google.com/r/adamtybor-roboguice/ Для первоначального всплеска.
По сути, если вы используете Roboguice, вы можете определить компонент для нижнего колонтитула и просто ввести этот компонент нижнего колонтитула в каждое действие.
К сожалению, вам все еще нужно добавить контроллер к каждой деятельности, точно так же, как вы делали с макетом, но хорошая новость заключается в том, что все подключается для вас, и вся ваша логика остается в одном классе.
Ниже приведен некоторый псевдо -код некоторых примеров использования.
public class FooterController {
@InjectView(R.id.footer_button) Button button;
@Inject Activity context;
@ContextObserver
public void onViewsInjected() {
button.setOnClickListener(new OnClickListener() {
void onClick() {
Toast.makeToast(context, "My button was clicked", Toast.DURATION_SHORT).show();
}
});
}
}
public class MyActivity1 extends RoboActivity {
@Inject FooterController footer;
}
public class MyActivity2 extends RoboActivity {
@Inject FooterController footer;
}
Решение, как вы описываете, невозможно, извините. Но вы можете иметь общую родительскую деятельность для всех ваших действий, которые используют нижний колонтитул. В деятельности просто предоставляют методы обработчика для кнопок нижнего колонтитула, затем просто наследуйте от нее каждый раз, когда вам нужно справиться с действиями нижнего колонтитула.