首页 > 解决方案 > (Android) 尝试使用微调器选择来切换 imageview 中的图像,但无法解析 onItemSelected 中的 imageview

问题描述

如标题中所述,我正在尝试编写代码,根据用户在微调器中的选择来切换 ImageView 中显示的图像(页面有 3 个微调器,但只有一个用于切换图像)。我在这里检查了几个类似问题的解决方案,几乎所有解决方案都在 onCreate 方法中实例化 ImageView 对象,并设置微调器侦听器的 onItemSelected 方法中使用的可绘制资源。但是,当我尝试在 onItemSelected 方法中引用 ImageView 对象时,我收到一条错误消息,指出“无法解析符号”。显然我错过了一些东西,但我无法弄清楚。

date_location.xml 中的 ImageView 和 Spinner:

<ImageView
    android:id="@+id/map"
    android:layout_width="wrap_content"
    android:layout_height="118dp"
    android:layout_marginBottom="43dp"
    android:background="#ff7c7c "
    app:layout_constraintBottom_toTopOf="@+id/locationSpinner"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:srcCompat="@drawable/location1" />

<Spinner
    android:id="@+id/locationSpinner"
    android:layout_width="172dp"
    android:layout_height="46dp"
    android:layout_marginBottom="56dp"
    android:layout_marginEnd="16dp"
    android:background="#ff7c7c "
    app:layout_constraintBottom_toTopOf="@+id/dateSpinner"
    app:layout_constraintEnd_toEndOf="parent"></Spinner>

strings.xml 中使用的字符串数组:

<string-array name="locations">
    <item>Arlington, PA</item>
    <item>Burmingham, PA</item>
    <item>Essex, PA</item>
</string-array>

LocationDate.java 中 onCreate 方法的代码片段:

final ImageView img = findViewById(R.id.map);

Spinner locationSpin = findViewById(R.id.locationSpinner);
ArrayAdapter<CharSequence> locationA = ArrayAdapter.createFromResource(this, R.array.locations, android.R.layout.simple_spinner_item);
locationA.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
locationSpin.setAdapter(locationA);
locationSpin.setOnItemSelectedListener(this);

来自 LocationDate.java 的 onItemSelected 中的代码:

public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
    switch (parent.getId())
    {
        case R.id.locationSpinner:
            location = parent.getItemAtPosition(position).toString();
            String[] locationsArray = getResources().getStringArray(R.array.locations);
            if (location == locationsArray[0])
            {
                img.setImageResource(R.drawable.location1);
            }else if (location == locationsArray[1])
            {
                img.setImageResource(R.drawable.location2);
            }else if (location == locationsArray[2])
            {
                img.setImageResource(R.drawable.location3);
            }
        case R.id.dateSpinner:
            showDate = parent.getItemAtPosition(position).toString();
        case R.id.timeSpinner:
            showTime = parent.getItemAtPosition(position).toString();
    }
}

以防万一它在这里有用的是完整的 LocationDate.java 类:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;

public class LocationDate extends AppCompatActivity implements 
AdapterView.OnItemSelectedListener
{
String location = "";
String showDate = "";
String showTime = "";

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.date_location);

    final ImageView img = findViewById(R.id.map);

    Spinner locationSpin = findViewById(R.id.locationSpinner);
    ArrayAdapter<CharSequence> locationA = ArrayAdapter.createFromResource(this, R.array.locations, android.R.layout.simple_spinner_item);
    locationA.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    locationSpin.setAdapter(locationA);
    locationSpin.setOnItemSelectedListener(this);

    Spinner dateSpin = findViewById(R.id.dateSpinner);
    ArrayAdapter<CharSequence> dateA = ArrayAdapter.createFromResource(this, R.array.dates, android.R.layout.simple_spinner_item);
    dateA.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dateSpin.setAdapter(dateA);
    dateSpin.setOnItemSelectedListener(this);

    Spinner timeSpin = findViewById(R.id.timeSpinner);
    ArrayAdapter<CharSequence> timeA = ArrayAdapter.createFromResource(this, R.array.times, android.R.layout.simple_spinner_item);
    timeA.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    timeSpin.setAdapter(timeA);
    timeSpin.setOnItemSelectedListener(this);

    Button proceed2 = findViewById(R.id.button2);
    proceed2.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            Intent data = new Intent();
            data.putExtra("Location", location);
            data.putExtra("Date", showDate);
            data.putExtra("Time", showTime);
            setResult(Activity.RESULT_OK ,data);
            finish();
        }
    });
}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
    switch (parent.getId())
    {
        case R.id.locationSpinner:
            location = parent.getItemAtPosition(position).toString();
            String[] locationsArray = getResources().getStringArray(R.array.locations);
            if (location == locationsArray[0])
            {
                img.setImageResource(R.drawable.location1);
            }else if (location == locationsArray[1])
            {
                img.setImageResource(R.drawable.location2);
            }else if (location == locationsArray[2])
            {
                img.setImageResource(R.drawable.location3);
            }
        case R.id.dateSpinner:
            showDate = parent.getItemAtPosition(position).toString();
        case R.id.timeSpinner:
            showTime = parent.getItemAtPosition(position).toString();
    }
}

@Override
public void onNothingSelected(AdapterView<?> parent)
{

}
}

^ 格式在粘贴时略有混乱,但希望它仍然具有足够的可读性。

谢谢阅读!

标签: javaandroidxml

解决方案


找不到该符号,因为您在方法final ImageView img = findViewById(R.id.map);的范围内声明,但在尝试实际使用它时onActivityCreate(Bundle)没有在内部定义它。onItemSelected(...)

public void onItemSelected(AdapterView<?> parent, View view, int position, long id)只需在您尝试访问它之前将该声明移入,该符号将被解析。


推荐阅读