Вопрос

Я прихожу к вам на согнутом колене, вопрос в руке. Я относительно новичок в 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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top