Android LayoutInflater не работает в отдельном классе и ошибок не возникает - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть отдельный класс для onClickListener, и я пытаюсь раздуть представление, чтобы изменить текст, щелкнув здесь код активности

    playNext.setOnClickListener(new ExternalOnClickListener(this));
    playPrevious.setOnClickListener(new ExternalOnClickListener(this));

Компоновка

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NowPlaying"
android:background="#000">

<ImageView
    android:id="@+id/album_cover"
    style="@style/nowPlaying_background"/>

<include layout="@layout/top_buttons"/>

<TextView
    android:id="@+id/album"
    style="@style/nowPlaying_albumName"
    android:text="album name"/>

<TextView
    android:id="@+id/song"
    android:text="song name"
    style="@style/nowPlaying_songName"/>

<LinearLayout
    android:id="@+id/controllers"
    style="@style/controllers_linearLayout">

    <View
        style="@style/nowPlaying_controllers_view_divider"/>

    <Button
        android:id="@+id/skip_previous"
        style="@style/previous_song_btn"
        android:text="" />

    <Button
        android:id="@+id/play_pause"
        style="@style/play_pause"/>


    <Button
        android:id="@+id/skip_next"
        style="@style/previous_song_btn.next_song_btn"
        android:text=""/>

  </LinearLayout>

</RelativeLayout>

Класс

public class ExternalOnClickListener implements View.OnClickListener {

private Context context;
private SharedPreferenceConfig preferenceConfig;
private int songIndex = 0;
private int nextSongIndex = 0;
private int previousSongIndex = 0;
private String songName, curSong;

public ExternalOnClickListener(Context context) {
    this.context=context;
    preferenceConfig = new SharedPreferenceConfig(context);

}

@Override public void onClick(View v) {
    switch (v.getId()){

        case R.id.skip_next:
            int songIndex = 0;
            int nextSongIndex = 0;
            String songName = preferenceConfig.readSongName();
            for(Songs s : MainActivity.songs) {
                boolean resultOfComparison= songName.equals(s.getSong());
                if(resultOfComparison){
                    int indexPlusOne = songIndex+1;
                    if((MainActivity.songs.size()) == indexPlusOne){
                        songIndex = 0;
                        nextSongIndex =0;
                    }
                    else{
                        nextSongIndex = songIndex + 1;
                    }

                    String nextSongName = MainActivity.songs.get(nextSongIndex).getSong();
                    String nextAlbumName = MainActivity.songs.get(nextSongIndex).getAlbum();
                    int nextAlbumCover = MainActivity.songs.get(nextSongIndex).getAlbumCover();

                    LayoutInflater inflater = LayoutInflater.from(context);
                    View vi = inflater.inflate( R.layout.activity_now_playing, null );

                    TextView songTextView = (TextView) vi.findViewById(R.id.song);
                    TextView albumTextView = (TextView) vi.findViewById(R.id.album);
                    ImageView albumCover = (ImageView) vi.findViewById(R.id.album_cover);

                    songTextView.setText(nextSongName);
                    albumTextView.setText(nextAlbumName);
                    albumCover.setImageResource(nextAlbumCover);

                    preferenceConfig.writeSongName(nextSongName);
                    Toast.makeText(context, nextSongName, Toast.LENGTH_SHORT).show();
                    break;
                }
                songIndex++;
            }
            break;
    }
  }
}

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

LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

Но все тот же результат. Как я могу правильно надуть макет из такого класса?

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

я думаю, что вы не правы, вам не нужен infalter, вы можете определить ваше изображение и текст, где

playNext.setOnClickListener(new ExternalOnClickListener(this));, вызываемый тогда в вашем пользовательском классе, передайте ваш элемент конструктору, теперь вы получили ваши представленияв пользовательском классе и не нужно определять тему в клик, просто сделайте свою логику как

           songTextView.setText(nextSongName);
            albumTextView.setText(nextAlbumName);
            albumCover.setImageResource(nextAlbumCover);

ОБНОВЛЕНИЕ:

вы должны передать свой элемент в конструктор как новый как:

private TextView songTextView;
public ExternalOnClickListener(Context context,Textview songTextView) {
    this.songTextView=songTextview;
    this.context=context;
    preferenceConfig = new SharedPreferenceConfig(context);

}
0 голосов
/ 08 апреля 2019

Может быть, это решение. (поскольку проблема завышена, но не задана как contentView действия)

  1. передать как активность вместо контекста.

  2. используйте это вместо раздувания:

    activity.setContentView (R.layout.activity_now_playing)

  3. vi.findViewById необходимо изменить на

    activity.findViewById (...)

...