Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 多次充气时与单击侦听器布局相关的问题_Android - Fatal编程技术网

Android 多次充气时与单击侦听器布局相关的问题

Android 多次充气时与单击侦听器布局相关的问题,android,Android,我在另一个布局中对一个布局进行了四次膨胀,现在我想将click listener添加到布局中的几个控件中。当我这样做时,它只更改最后一个布局的值,而不是更改到相应的布局 公共类drsdeail扩展活动{ TextView changeCode; Button generate, fromVessel, toVessel; String strFromVessel, strToVessel, stroverTime, stroffShoreTime, stronShoreTime;

我在另一个布局中对一个布局进行了四次膨胀,现在我想将click listener添加到布局中的几个控件中。当我这样做时,它只更改最后一个布局的值,而不是更改到相应的布局

公共类drsdeail扩展活动{

TextView changeCode;
Button generate, fromVessel, toVessel;
String strFromVessel, strToVessel, stroverTime, stroffShoreTime,
        stronShoreTime;
Spinner spinnerValues;
Date dateOne, dateTwo;
EditText overTime, offShoreTime, onShoreTime;
ArrayList<String> dataValues = new ArrayList<String>();
View layout_number;
int idValue = 10;
int i;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.drsdetail);

    changeCode = (TextView) findViewById(R.id.changeCode);
    generate = (Button) findViewById(R.id.generate);

    LinearLayout parent = (LinearLayout) findViewById(R.id.parentLayout);

    loadSpinnerData();
    for (i = 0; i < 4; i++) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout row = new LinearLayout(this);
        layout_number = inflater.inflate(R.layout.layoutinflate, parent,
                false);

        spinnerValues = (Spinner) layout_number
                .findViewById(R.id.spinnerValues);

        fromVessel = (Button) layout_number.findViewById(R.id.fromVessel);

        toVessel = (Button) layout_number.findViewById(R.id.toVessel);

        overTime = (EditText) layout_number.findViewById(R.id.overTimeEdit);

        offShoreTime = (EditText) layout_number
                .findViewById(R.id.offShoreEdit);

        onShoreTime = (EditText) layout_number
                .findViewById(R.id.onShoreEdit);

        row.addView(layout_number);
        parent.addView(row);
        assignClickListener(fromVessel);
        ArrayAdapter<String> adapterDataValues = new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_1, dataValues);
        adapterDataValues
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinnerValues.setAdapter(adapterDataValues);
    }

}

private void assignClickListener(final View vessel) {
    fromVessel.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Calendar mcurrentTime = Calendar.getInstance();
            int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
            int minute = mcurrentTime.get(Calendar.MINUTE);
            TimePickerDialog mTimePicker;
            mTimePicker = new TimePickerDialog(DRSDetail.this,
                    new TimePickerDialog.OnTimeSetListener() {

                        @Override
                        public void onTimeSet(TimePicker arg0,
                                int selectedHour, int selectedMinute) {
                            fromVessel.setText(selectedHour + ":"
                                    + selectedMinute);
                            strFromVessel = fromVessel.getText().toString();
                            System.out.println("strFromVessel"
                                    + strFromVessel);

                        }
                    }, hour, minute, true);// Yes 24 hour time
            mTimePicker.setTitle("Select Time");
            mTimePicker.show();

        }
    });
};

private void loadSpinnerData() {
    dataValues.clear();
    try {
        System.out.println("in try");
        DBHelper dbHelper = new DBHelper(DRSDetail.this);
        dbHelper.openDataBase();
        SQLiteDatabase db = dbHelper.getReadableDatabase();

        // project number
        Cursor crData = db.rawQuery("SELECT DRS_ID FROM  DRS_TBL", null);
        if (crData.getCount() > 0) {
            while (crData.moveToNext()) {
                dataValues.add(crData.getString(0));
                System.out.println("value of cr.getString "
                        + crData.getString(0));

            }
        }

        crData.close();
    } catch (Exception e) {
        System.out.println("exception");
    }

}
TextView更改代码;
按钮生成,从容器,到容器;
字符串strFromVesser,strToVesser,stroverTime,stroffShoreTime,
斯特朗肖雷时间;
微调器微调值;
日期一,日期二;
编辑文本超时、离岸时间、离岸时间;
ArrayList dataValues=新的ArrayList();
查看布局图编号;
int-idValue=10;
int i;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
setContentView(R.layout.drsdetail);
changeCode=(TextView)findViewById(R.id.changeCode);
generate=(按钮)findviewbyd(R.id.generate);
LinearLayout父项=(LinearLayout)findViewById(R.id.parentLayout);
加载SpinnerData();
对于(i=0;i<4;i++){
LayoutFlater充气器=(LayoutFlater)getSystemService(Context.LAYOUT\u充气器\u服务);
LinearLayout行=新的LinearLayout(该行);
布局号=充气机。充气(R.layout.LayoutFlate,父级,
假);
spinnerValues=(微调器)布局号
.findviewbyd(R.id.spinnerValues);
FromVesser=(按钮)布局号。findViewById(R.id.FromVesser);
ToVesser=(按钮)布局号。findViewById(R.id.ToVesser);
超时=(EditText)版面号.findViewById(R.id.overTimeEdit);
离岸时间=(编辑文本)版面号
.findViewById(R.id.offShoreEdit);
onShoreTime=(编辑文本)布局号
.findViewById(R.id.onShoreEdit);
行。添加视图(布局号);
parent.addView(行);
分配ClickListener(来自容器);
ArrayAdapter adapterDataValues=新的ArrayAdapter(
这是android.R.layout.simple_list_item_1,dataValues);
适配器数据值
.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
设置适配器(adapterDataValues);
}
}
私人船舶(最终视图船舶){
fromVesser.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
Calendar mcurrentTime=Calendar.getInstance();
int hour=mcurrentTime.get(Calendar.hour\u OF\u DAY);
int minute=mcurrentTime.get(Calendar.minute);
时间选择器Dialog mTimePicker;
mTimePicker=新时间选择器对话框(DRSDetail.this,
新的TimePickerDialog.OnTimeSetListener(){
@凌驾
时间集上的公共void(时间选择器arg0,
int selectedHour,int selectedMinute){
fromVesser.setText(选择小时+):“
+选择分钟);
strFromVesser=fromVesser.getText().toString();
System.out.println(“strFromVesser”
+strfrom容器);
}
},小时,分钟,对);//是的,24小时
setTitle(“选择时间”);
mTimePicker.show();
}
});
};
私有void loadSpinnerData(){
dataValues.clear();
试一试{
System.out.println(“in try”);
DBHelper DBHelper=新的DBHelper(DRSDetail.this);
dbHelper.openDataBase();
SQLiteDatabase db=dbHelper.getReadableDatabase();
//项目编号
游标crData=db.rawQuery(“从DRS\U TBL中选择DRS\U ID”,null);
如果(crData.getCount()>0){
while(crData.moveToNext()){
dataValues.add(crData.getString(0));
System.out.println(“cr.getString的值”
+crData.getString(0));
}
}
crData.close();
}捕获(例外e){
System.out.println(“例外”);
}
}

您的变量
fromVesser
每次通过循环都会被重新分配,因此在最后一次循环迭代中,它被分配到最终视图。每次调用
OnClickListener
时,它都会使用该视图-无论哪个视图调用了click listener

您需要的是一个闭包,以便可以引用每个不同的视图。您不能创建临时变量,因为它必须声明为final

您可以将
setOnClickListener
分解为它自己的函数范围:

private void assignClickListener(final View vessel) {
   vessel.setOnClickListener(new OnClickListener() {
       // Time picker stuff...
   });
});

从船舶
到船舶
加班
离岸时间
离岸时间
变量作为局部变量。不要全局声明它们。如果他这样做,他将无法在OnClickListener中引用它们,因为它们必须声明为最终变量,并且他无法在每个循环中更改它们迭代。@GregEnnis hmmmm…将它们声明为final没有问题。您将在
onClick()中收到
按钮的实例
作为一个参数……呃,我想你是对的。对不起,我没有喝我的咖啡。我只是想确认一下,在循环中你使用的是
Vesser
,而不是
FromVesser
。如果你只是复制并粘贴代码,并将其引用到
FromVesser
,那么是的,它将不起作用。请将代码发布到“assignClickListener”。您应该传递容器,而不是布局。应该是:
assignClickListener(fromVessel);
不,您没有进行我上面提到的修复。您需要从容器传递到assignClickListener。这是您遇到的问题的修复方法-您需要为布局中的4个容器中的每一个提供单独的引用。