Кнопка Onclick Listener во включенных раскладках - PullRequest
21 голосов
/ 08 ноября 2010

Я прихожу к вам на колени с вопросом в руке.Я относительно новичок в Android, так что извините за любые кощунственные вещи, которые я мог бы сказать.

Введение: У меня есть несколько макетов в приложении, которые все должны включать общий нижний колонтитул.В этом нижнем колонтитуле есть несколько важных кнопок для возврата на домашнюю страницу, выхода из системы и т. Д.

Мне удалось заставить этот нижний колонтитул появляться на всех необходимых страницах с помощью тегов Include и Merge.Проблема заключается в определении прослушивателей для всех кнопок.Хотя я могу определить слушателей в каждом действии, связанном с экранами, которые включают макет нижнего колонтитула, я считаю, что это становится ужасно утомительным, когда количество экранов увеличивается.

Мой вопрос такой: МожетЯ определяю приемник нажатия кнопки, который будет работать во всем приложении, к которому можно получить доступ с любого экрана с использованием атрибута android: onClick кнопки?

То есть я хотел бы определить слушателя нажатия кнопки один раз, в отдельном классе, скажем FooterClickListeners , и просто назвать этот класс в качестве класса слушателя для любых нажатий кнопок.нижний колонтитулИдея состоит в том, чтобы создать единую точку доступа для кода слушателя, чтобы любые и все изменения в упомянутых слушателях отражались во всем приложении.

Ответы [ 3 ]

18 голосов
/ 09 января 2011

У меня была такая же проблема с меню, которое я использовал в нескольких макетах. Я решил проблему, надувая 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));
        }
    };  
}

layout.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) в других макетах.

3 голосов
/ 28 декабря 2010

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

Оформить заказ 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;
}
0 голосов
/ 08 ноября 2010

Решение, как вы описываете, невозможно, извините. Но у вас может быть общая родительская активность для всех ваших действий, которые используют нижний колонтитул. В упражнении просто предоставьте методы-обработчики для кнопок нижнего колонтитула, а затем просто наследуйте их каждый раз, когда вам нужно обработать действия нижнего колонтитула.

...