如何编写没有xml的Android应用程序

时间:2014-02-14 15:46:36

标签: android xml resources

question asked yesterday之后,我仍然试图在没有任何xml的情况下写入小应用程序。这是我的尝试(原始代码here),它有效,但由于“Resources $ NotFoundException”失败,如果两个注释掉的行替换它们之前的两行:

public class SpinnerExample extends Activity {

    private Spinner spinner;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout linearLayout = new LinearLayout(this);
        setContentView(linearLayout);

        spinner = new Spinner(this);
        linearLayout.addView(spinner);

        List<String> list = new ArrayList<String>();
        list.add("Android");
        list.add("Java");
        list.add("Spinner Data");
        list.add("Spinner Adapter");
        list.add("Spinner Example");

        TextView textView = new TextView(this);

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,list);
        //ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, 0x7f030012, list);

        CheckedTextView checkedTextView = new CheckedTextView(this);
        checkedTextView.setId(0x7f030022);  // arbitrary value

        dataAdapter.setDropDownViewResource(android.R.layout.spinner_dropdown);
        //dataAdapter.setDropDownViewResource(0x7f030012);

        spinner.setAdapter(dataAdapter);
}

    // Add spinner data

    public void addListenerOnSpinnerItemSelection(){
        spinner.setOnItemSelectedListener(new CustomOnItemSelectedListener());
    }
}

xml资源参考:

android.R.layout.simple_spinner_item:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    style="?android:attr/spinnerItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:textAlignment="inherit"/>

android.R.layout.spinner_dropdown:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/dropdownListPreferredItemHeight"
    android:ellipsize="marquee"
    android:textAlignment="inherit"/>

有人可以解释为什么会出现这种异常以及如何防止它并拥有一个没有xml的应用程序?

提前致谢。

更新:添加了323go的建议并完成了这个课程:

public class MyArrayAdapter<T> extends ArrayAdapter<T> {

    List<T> list;

    public MyArrayAdapter(Context context, int resource, List<T> objects) {
        super(context, resource, objects);
        // TODO Auto-generated constructor stub
        list = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        CheckedTextView tv = new CheckedTextView( this.getContext() );
        tv.setText( "This is item " + position );
        return tv;
    }
}

...显然在原始代码中用MyArrayAdapter替换了ArrayAdapter。结果是微调器显示为“这是项目0”,但仍然给出了原始异常,即你点击微调器。

UPDATE-2

这个问题已经解决了一半,我可以用这个ArrayAdapter摆脱第一个xml引用:

public class MyArrayAdapter<T> extends ArrayAdapter<T> {

    List<T> list;

    public MyArrayAdapter(Context context, int resource, List<T> objects) {
        super(context, resource, objects);
        list = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        CheckedTextView tv = new CheckedTextView( this.getContext() );
        tv.setText(list.get(position).toString());
        return tv;
    }
}

现在可以像这样修改SpinnerExample中的代码:

TextView textView = new TextView(this);

MyArrayAdapter<String> dataAdapter = new MyArrayAdapter<String>(this, textView.getId(), list);

新的是我了解到Android将id归属于在代码中创建的小部件。所以不需要这个:

textView.setId(0x7f030012); //任意int

1 个答案:

答案 0 :(得分:2)

你的方式错了。是否要使用XML,如果要按ID访问元素,则仍需要ID。硬编码ID不是一个好主意,使用android.R.id...常量没有错。

此外,您的代码失败的原因是setDropDownViewResource()需要布局的ID,而不是实际的视图。布局将告诉Android通过LayoutInflater创建哪些视图。如果您的代码有效,那么每个Spinner行的id都会引用相同的视图。

如果您想自己完全处理UI创建,则需要覆盖ArrayAdapter,以便getView返回每个元素的视图。但是,使用android.R布局可能更容易,除非您需要不同的东西。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView tv = new TextView( context, parent );
    tv.setText( "This is item " + position );
    return tv;
}