【问题标题】:Find other child Views from dynamically created layout从动态创建的布局中查找其他子视图
【发布时间】:2017-03-22 23:16:45
【问题描述】:

我有一个微调器,当用户选择一个值时,onItemSelectedListener 会打开一个对话框来放置更多详细信息

private AdapterView.OnItemSelectedListener spinnerListeners=new AdapterView.OnItemSelectedListener(){
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        switch (parent.getId()){
            case R.id.puttSpinner:
                // open dialog to enter Additional putt Stats
                if(position > 0 ) {
                    AlertDialog.Builder alertDialog = new AlertDialog.Builder(v.getContext());
                    LinearLayout layout = new LinearLayout(v.getContext());
                    LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,     LinearLayout.LayoutParams.WRAP_CONTENT);layout.setOrientation(LinearLayout.VERTICAL);layout.setLayoutParams(parms);
                    layout.setGravity(Gravity.CLIP_VERTICAL);
                    layout.setPadding(2, 2, 2, 2);
                    for (int i=1;i<position+1;i++){
                        LinearLayout ll = new LinearLayout(v.getContext());
                        LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.MATCH_PARENT,
                                LinearLayout.LayoutParams.WRAP_CONTENT);
                        ll.setOrientation(LinearLayout.HORIZONTAL);
                        ll.setLayoutParams(llp);
                        TextView tv = new TextView(v.getContext());
                        tv.setText("Putt "+String.valueOf(i)+":");
                        tv.setPadding(40, 40, 40, 40);
                        tv.setGravity(Gravity.CENTER);
                        tv.setTextSize(20);
                        LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.MATCH_PARENT,
                                LinearLayout.LayoutParams.WRAP_CONTENT);
                        tvParams.bottomMargin = 5;
                        //ll.addView(tv,tvParams);
                        ll.addView(tv);

                        Spinner s = new Spinner(v.getContext());
                        String[] puttDistList = getResources().getStringArray(R.array.putt_dist_list);
                        s.setAdapter(new ArrayAdapter<String>(v.getContext(),R.layout.putting_practice, puttDistList));
                        s.setOnItemSelectedListener(puttDistSelectListener);
                        LinearLayout.LayoutParams sParams = new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.WRAP_CONTENT,
                                LinearLayout.LayoutParams.WRAP_CONTENT);
                        ll.addView(s,sParams);

                        layout.addView(ll);
                    }
                    alertDialog.setView(layout);
                    alertDialog.setTitle("Putting Stats - Distance to Pin");
                    alertDialog.setNegativeButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
                    alertDialog.show();
                }

                break;
        }
    }

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

    }
};

现在,当用户从 Dialog Spinner s 中选择值时,它的侦听器会使用用户输入更新数据库,但我如何获取与此微调器关联的 TextView tv 的文本值

TextView 和 Spinner 都包含在父布局“布局”中动态创建的线性布局“ll”中。两者都是动态创建的

提前致谢

final AdapterView.OnItemSelectedListener puttDistSelectListener = new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        //add the putt# and distance to temp_putt_stats table
        DbAdapter adapter = new DbAdapter(view.getContext());
         String distValue = parent.getItemAtPosition(position).toString();
        switch (position){
            case 0: //Inches
                break;
            case 1: //<3ft
                break;
            case 2: //<6 ft
                break;
            case 3: //<10 ft
                break;
            case 4: //10-20
                break;
            case 5: //20-30
                break;
            case 6: //30-40
                break;
            case 7: //> 40
                break;
        }
        Toast.makeText(view.getContext(), "Position :"+position+"  ListItem : " +distValue ,Toast.LENGTH_SHORT).show();

    }

【问题讨论】:

    标签: android android-layout onitemselectedlistener


    【解决方案1】:

    你可以使用标签。

    在生成布局时,您可以将标签 (setTag()) 分配给项目 (1-x),然后您可以执行以下操作:

    final AdapterView.OnItemSelectedListener puttDistSelectListener = new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        //add the putt# and distance to temp_putt_stats table
        DbAdapter adapter = new DbAdapter(view.getContext());
         String distValue = parent.getItemAtPosition(position).toString();
        int tagNumber = (int) view.getTag();
        switch (tagNumber ){
            case 0: //Inches
                break;
            case 1: //<3ft
                break;
            case 2: //<6 ft
                break;
            case 3: //<10 ft
                break;
            case 4: //10-20
                break;
            case 5: //20-30
                break;
            case 6: //30-40
                break;
            case 7: //> 40
                break;
        }
        Toast.makeText(view.getContext(), "Position :"+position+"  ListItem : " +distValue ,Toast.LENGTH_SHORT).show();
    
    }
    

    所选项目的文本可以被检索到

    TextView tv = (TextView) view.findViewByTag(x);
    tv.getText();
    

    【讨论】:

    • 我收到了NPE 提供的解决方案
    • 您还必须为微调器项目(不是 arrayadapter)使用自定义适配器,并且在这个新适配器的 onBindView 中,您可以为 textviews 分配标签
    【解决方案2】:

    对于 API 17 及更高版本,您可以为您生成的每个 View 生成一个 id,并将其设置为 setId()。请参阅generateViewIdsetid

    Xiaochao Yang 在回答this Stack Overflow 问题时解释了这一点以及在 API 17 之前要做什么。

    设置生成的 id 后,您可以使用findViewById() 在父布局中查找视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多