【问题标题】:Android: error loading drawable background on a LinearLayoutAndroid:在 LinearLayout 上加载可绘制背景时出错
【发布时间】:2014-01-20 11:25:52
【问题描述】:

我在尝试将背景加载到 LinearLayout 时遇到 NullpointerException 错误:

LinearLayout fondoSpinner = (LinearLayout) findViewById (R.id.fondoSpinner); fundoSpinner.setBackgroundResource (R.drawable.spinner_morado_gradiente);

LinearLayout 属于自定义微调器。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fondoSpinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/spinner_naranja_gradiente"
android:orientation="horizontal" >

<ImageView
    android:id="@+id/imagenSpinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

<TextView
    android:id="@+id/textoSpinner"
    style="@style/SpinnerText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:gravity="left"/> 

此代码还会向您收取后台费用,并且可以正常工作。当我尝试将其加载到主目录时发生错误。我必须动态更改颜色

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);


    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.activity_main);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.barra_titulo);

cargarCombo();

    LinearLayout fondoSpinner = (LinearLayout)findViewById(R.id.fondoSpinner);
    fondoSpinner.setBackgroundResource(R.drawable.spinner_morado_gradiente);
}  

private void cargarCombo() {

    Spinner spinner = (Spinner) findViewById(R.id.comboTipo_Vistos);
    listaSpinner = new ArrayList<CountryInfo>();


        listaSpinner = cargarComboVistos();


    CountryAdapter myAdapter = new CountryAdapter
            (this, android.R.layout.simple_spinner_item, listaSpinner);

    spinner.setAdapter(myAdapter);
}

private ArrayList<CountryInfo> cargarComboVistos() {

    ArrayList<CountryInfo> lista = new ArrayList<CountryInfo>();

    int imagen = R.drawable.mapanaranja;

    lista.add(new CountryInfo("Todos", imagen));
    lista.add(new CountryInfo("Sí", imagen));
    lista.add(new CountryInfo("No", imagen));

    return lista;
}

public class CountryAdapter extends ArrayAdapter<CountryInfo>
{
    private Activity context;
    ArrayList<CountryInfo> data = null;

    public CountryAdapter(Activity context, int resource, ArrayList<CountryInfo> data)
    {
        super(context, resource, data);
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {   // Ordinary view in Spinner, we use android.R.layout.simple_spinner_item
        return super.getView(position, convertView, parent);   
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent)
    {   // This view starts when we click the spinner.
        View row = convertView;
        if(row == null)
        {
            LayoutInflater inflater = context.getLayoutInflater();
            row = inflater.inflate(R.layout.spinner_row, parent, false);
        }

        CountryInfo item = data.get(position);

        if(item != null)
        {   // Parse the data from each object and set it.
            ImageView imagenSpinner = (ImageView) row.findViewById(R.id.imagenSpinner);
            TextView textoSpinner = (TextView) row.findViewById(R.id.textoSpinner);

            if(imagenSpinner != null)
            {
                imagenSpinner.setBackgroundResource(item.getCountryFlag());
            }
            if(textoSpinner != null)
                textoSpinner.setText(item.getCountryName());

        }

        return row;
    }
}

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
    <shape>
        <solid
            android:color="#9933CC" />
        <stroke
            android:width="3dp"
            android:color="#AA66CC" />
       <padding
            android:left="4dp"
            android:top="4dp"
            android:right="4dp"
            android:bottom="4dp" />
    </shape>
</item> 
<item>
    <shape>
        <gradient
            android:startColor="#FFFFFF"
            android:endColor="#FFFFFF"
            android:angle="270" 
            android:type="linear"
            />
        <stroke
            android:width="1dp"
            android:color="#9933CC" />
        <padding
            android:left="4dp"
            android:top="4dp"
            android:right="4dp"
            android:bottom="4dp" />
    </shape>
</item>
</selector>

【问题讨论】:

  • FondoSpinner.setBackgroundResource (R.drawable.spinner_morado_gradiente) 行中的 NullpointerException
  • 因此您的活动视图层次结构不包含具有此类 ID 的视图。您在哪里实例化/引用包含 fondaSpinner 布局的布局?
  • 在主类中。在 oncreate 方法中
  • 所以发布您的活动代码...

标签: android background android-linearlayout drawable


【解决方案1】:

要自定义微调器项目布局,请在适配器 getView() 中进行。例如:

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{   // Ordinary view in Spinner, we use android.R.layout.simple_spinner_item
    View v = super.getView(position, convertView, parent);
    v.setBackgroundResource(R.drawable.spinner_morado_gradiente);
    return v;
}

【讨论】:

  • 当然,您必须从 onCreate() 中删除 fundoSpinner 代码。
  • 编辑了答案,因为您要修改的线性布局实际上是微调器项目的根元素。如果仍然存在问题,请查看 logcat 中的异常堆栈跟踪并将其包含在问题中,明确指定异常在您的代码中发生的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2011-08-24
  • 1970-01-01
相关资源
最近更新 更多