问题描述
我想熟悉 Android 并开始参加一些 Udacity 课程。目前,为了语言学习目的,我们必须让 ImageButton
在点击时播放一些音频。
我认为如果按钮也切换会很好,例如,在暂停状态下,它应该显示一个“播放”图标,在播放状态下,一个“暂停”图标。使用 OnClickListener 实现这一点非常简单,它也可以正常工作,最多 1 个小细节:用户必须单击按钮两次。
经过一番搜索,我发现第一次单击用于将视图聚焦在该位置,而第二个视图用于实际处理触发的 OnClickEvent。我尝试将 focusable
和 focusableInTouchMode
属性更改为所有可能位置的所有可能组合,但没有奏效。
这是我的主要活动:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView numbersView = findViewById(R.id.numbers);
numbersView.setonClickListener(v -> {
Intent numbersIntent = new Intent(MainActivity.this,NumbersActivity.class);
startActivity(numbersIntent);
});
TextView familyView = findViewById(R.id.family);
familyView.setonClickListener(v -> {
Intent familyIntent = new Intent(MainActivity.this,FamilyActivity.class);
startActivity(familyIntent);
});
TextView colorView = findViewById(R.id.colors);
colorView.setonClickListener(v -> {
Intent colorsIntent = new Intent(MainActivity.this,ColorActivity.class);
startActivity(colorsIntent);
});
TextView phrasesView = findViewById(R.id.phrases);
phrasesView.setonClickListener(v -> {
Intent phrasesIntent = new Intent(MainActivity.this,PhrasesActivity.class);
startActivity(phrasesIntent);
});
}
}
这里是对应的xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity"
android:orientation="vertical"
android:divider="?android:dividerHorizontal"
android:showDividers="middle"
android:background="#212121">
<TextView
android:id="@+id/numbers"
style="@style/CategoryStyle"
android:layout_height="wrap_content"
android:text="@string/numbers"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:textColor="#b794f6"/>
<TextView
android:id="@+id/family"
style="@style/CategoryStyle"
android:layout_height="wrap_content"
android:text="@string/family"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:textColor="#90CAF9"/>
<TextView
android:id="@+id/colors"
style="@style/CategoryStyle"
android:layout_height="wrap_content"
android:text="@string/colors"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:textColor="#EEEEEE"/>
<TextView
android:id="@+id/phrases"
style="@style/CategoryStyle"
android:layout_height="wrap_content"
android:text="@string/phrases"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:textColor="#FFE082"/>
这是我的 NumbersActivity(其他活动非常相似):
public class NumbersActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.word_list);
ListView view = findViewById(R.id.coolList);
List<Word> words = new ArrayList<>(Arrays.asList(
new Word("lutti","one",R.drawable.number_one,R.raw.test_audio),new Word("otiiko","two",R.drawable.number_two,new Word("tolookosu","three",R.drawable.number_three,new Word("oyyisa","four",R.drawable.number_four,new Word("massokka","five",R.drawable.number_five,new Word("temmokka","six",R.drawable.number_six,new Word("kenekaku","seven",R.drawable.number_seven,new Word("kawinta","eight",R.drawable.number_eight,new Word("wo'e","nine",R.drawable.number_nine,new Word("na'aacha","ten",R.drawable.number_ten,R.raw.test_audio)));
WordAdapter itemsAdapter = new WordAdapter(this,words,getColor(R.color.numbers_category));
view.setAdapter(itemsAdapter);
}
}
//我知道这样做并没有那么好,我只需要启动并运行一些东西,然后再担心这些变化。
这里是xml:
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/coolList"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:divider="#B0BEC5"
android:dividerHeight="2dp"
android:background="#212121"
android:focusable="false"
android:focusableInTouchMode="false"></ListView>
这是词类:
public class Word {
private String miwokTranslation;
private String defaultTranslation;
private int ressourceID = -1; //just init,in order to check for it later
private int audioID;
public Word(String miwokTranslation,String defaultTranslation,int ressourceID,int audioID) {
this.miwokTranslation = miwokTranslation;
this.defaultTranslation = defaultTranslation;
this.ressourceID = ressourceID;
this.audioID = audioID;
}
public Word(String miwokTranslation,int audioID) {
this.miwokTranslation = miwokTranslation;
this.defaultTranslation = defaultTranslation;
this.audioID = audioID;
}
public String getMiwokTranslation() {
return miwokTranslation;
}
public String getDefaultTranslation() {
return defaultTranslation;
}
public int getResourceID() {
return ressourceID;
}
public int getAudioID() {
return audioID;
}
@Override
public String toString() {
return miwokTranslation + "\n" + defaultTranslation;
}
}
这是相应的适配器:
public class WordAdapter extends ArrayAdapter<Word> {
private final int color;
Context context;
public WordAdapter(@NonNull Context context,@NonNull List<Word> objects,int color) {
super(context,objects);
this.color = color;
this.context = context;
}
@RequiresApi(api = Build.VERSION_CODES.O)
@SuppressLint("ClickableViewAccessibility")
@NonNull
@Override
public View getView(int position,@Nullable View convertView,@NonNull ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item,parent,false);
}
Word item = getItem(position);
ImageView image = convertView.findViewById(R.id.list_item_icon);
if(item.getResourceID() == -1) {
image.setVisibility(View.GONE);
} else {
image.setimageResource(item.getResourceID());
}
TextView miwokWord = convertView.findViewById(R.id.miwok_word);
miwokWord.setText(item.getMiwokTranslation());
miwokWord.setTextColor(color);
TextView defaultWord = convertView.findViewById(R.id.default_word);
defaultWord.setText(item.getDefaultTranslation());
defaultWord.setTextColor(color);
ImageButton button = convertView.findViewById(R.id.imageButton);
MediaPlayer mediaPlayer = MediaPlayer.create(context,item.getAudioID());
button.setonClickListener(v -> {
if (!mediaPlayer.isPlaying()) {
button.setimageResource(R.drawable.play_icon);
mediaPlayer.start();
} else {
button.setimageResource(R.drawable.pause_icon);
mediaPlayer.pause();
}
});
return convertView;
}
}
这些注释是由于以前的努力而产生的,我没有删除它们,以防我再次需要它们。
最后但并非最不重要的是,这是适配器的 xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:minHeight="?android:attr/listPreferredItemHeight"
android:padding="16dp"
android:focusable="true"
android:focusableInTouchMode="false">
<ImageView
android:id="@+id/list_item_icon"
android:layout_width="88dp"
android:layout_height="88dp"
android:contentDescription="@string/magic"
android:background="#424242"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:paddingStart="16dp"
tools:ignore="RtlSymmetry">
<TextView
android:id="@+id/miwok_word"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:textStyle="bold"/>
<TextView
android:id="@+id/default_word"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
<ImageButton
android:id="@+id/imageButton"
android:layout_width="73dp"
android:layout_height="match_parent"
android:contentDescription="@string/playsound"
android:src="@drawable/play_icon"/></LinearLayout>
到目前为止,我已经坐了几个小时,没有任何重大进展,此时我对下一步要做什么没有任何线索。 任何帮助将不胜感激。
提前致谢
解决方法
不确定为什么您得出的结论是专注与您的问题有关。
如果图标的默认开始状态是 android:src="@drawable/play_icon"
并且 mediaPlayer 的默认开始状态是“不播放”,那么第一次点击不会导致 button.setImageResource(R.drawable.play_icon);
只是...又是播放图标?因此,第一次单击将图标从播放更改为播放,第二次将其从播放更改为暂停。
您是否尝试过使用 breakpoint 调试您的代码?在您的点击监听器中设置一个,看看会发生什么。