Подтвердить что ты не робот

Кнопка Onclick Listener во включенном макете

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Оформить покупку http://code.google.com/r/adamtybor-roboguice/ для первоначального всплеска.

В принципе, если вы используете roboguice, вы можете определить компонент для нижнего колонтитула и просто вставить этот компонент нижнего колонтитула в каждое действие.

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

Ниже приведен некоторый псевдокод примера использования примера.

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;
}

Ответ 3

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