Я пытаюсь превратить пару кнопок в допускающий повторное использование компонент в Android. Я успешно получил XML / работа части UI, но я не могу выяснить, как сделать код позади него допускающим повторное использование между операциями, за исключением перекодирования его везде. Я плохо знаком с Android, таким образом, я приношу извинения, если это очевидно.
Я уже несколько раз рассматривал это сообщение: Приемы расположения Android 3 - Часть 1, но это, кажется, пропускает несколько файлов, и у меня нет достаточного опыта восстановить их.
dumbed вниз версия моего основного расположения:
и затем моего "компонента":
Если бы у Вас есть какие-либо дополнительные критические анализы на моем XML, я ценил бы это также.
Что я делаю, так это создаю настоящий компонент, который содержит весь общий код, и использую его напрямую. Вот урезанная версия класса компонента:
public class NavigationBar extends LinearLayout {
public NavigationBar(Context context) {
super(context);
setupView(context);
hookupButtons(context);
}
public NavigationBar(Context context, AttributeSet attrs) {
super(context, attrs);
setupView(context);
hookupButtons(context);
}
private void setupView(Context context) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// inflate whatever layout xml has your common xml
inflater.inflate(R.layout.navigation_bar, this);
}
}
В моем классе hookupButton делает именно то, что вы думаете, что он должен делать. :-)
Тогда мои xmls во всех моих макетах выглядят примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.dragonglobal.dragonplayer.ui.widgets.NavigationBar
android:id="@+id/nav_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ListView
android:id="@+id/list_of_playlists"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
В onCreate каждой активности у меня также есть это (что вы можете адаптировать к тому, что вам нужно):
NavigationBar navbar = (NavigationBar) findViewById(R.id.nav_bar);
navbar.setText("Playlists");
Конечно, вам нужно будет добавить любые импорты, которые вам нужны.
EDIT
Просто уточнение: Мой navigation_bar.xml выглядит очень похоже на ваш, за исключением того, что у меня нет строк слияния.
EDIT 2
Вот как выглядит hookupButtons. Я показываю только одну кнопку, но вы должны понять идею.
private void hookupButtons(final Context context) {
ImageButton playlistsBtn = (ImageButton)findViewById(R.id.nav_playlists_btn);
if (context instanceof PlaylistsActivity) {
playlistsBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.nav_playlists_active));
} else {
playlistsBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(context, PlaylistsActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
context.startActivity(i);
}
});
}
}
Используя XML-макет, вы делаете многоразовым только макет, а не любой Java-код, который его использует.
Вы должны создать подкласс View, если хотите также повторно использовать логику Java. В учебнике по вашей ссылке есть пример, который очень хорошо подходит для вашей задачи:
public class OkCancelBar extends LinearLayout {
...