Многократное использование расположения XML и код позади

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

Я уже несколько раз рассматривал это сообщение: Приемы расположения Android 3 - Часть 1, но это, кажется, пропускает несколько файлов, и у меня нет достаточного опыта восстановить их.

dumbed вниз версия моего основного расположения:

  


    

        


и затем моего "компонента":



      

            


                          

        
        

Если бы у Вас есть какие-либо дополнительные критические анализы на моем XML, я ценил бы это также.

15
задан reuscam 8 July 2010 в 18:10
поделиться

2 ответа

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

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);
            }
        });
    }
}
16
ответ дан 1 December 2019 в 04:17
поделиться

Используя XML-макет, вы делаете многоразовым только макет, а не любой Java-код, который его использует.

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

public class OkCancelBar extends LinearLayout {
...
0
ответ дан 1 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: