【问题标题】:Accessing non-final values inside anonymous inner class访问匿名内部类中的非最终值
【发布时间】:2023-03-13 15:01:01
【问题描述】:

我有这 5 个 Edittext 字段,我想使用一个按钮将这些值写入数据库。对于按钮 Clicklistener,我使用了匿名内部类,但只允许使用最终值,这意味着在写入数据库时​​我将获得空字段。我如何才能将这些字段作为非最终字段访问?有什么办法吗?

 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    EditText yardarea = (EditText)view.findViewById(R.id.yardarea);
    String areaofyard = yardarea.getText().toString();
    EditText brick = (EditText)view.findViewById(R.id.brick);
    final String brickused = brick.getText().toString();
    EditText rcc = (EditText)view.findViewById(R.id.rcc);
    final String rccused = rcc.getText().toString();
    EditText overhead = (EditText)view.findViewById(R.id.overhead);
    final String ovhh = overhead.getText().toString();
    EditText underground = (EditText)view.findViewById(R.id.underground);
    final String ung = underground.getText().toString();

    Button button = (Button) view.findViewById(R.id.register);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DatabaseAccess databaseAccess = DatabaseAccess.getInstance(getActivity().getApplicationContext());
            databaseAccess.open();
            databaseAccess.insertIntoCriteriaTable(areaofyard, brickused, rccused, ovhh, ung );
            databaseAccess.close();
        }
    });
}

【问题讨论】:

  • 你想从edittext获取值吗?
  • @AbhayBohra 是的。我稍微编辑了代码。请看。
  • 为什么不将字符串和变量声明为全局变量?

标签: java android inner-classes anonymous-inner-class


【解决方案1】:

尝试将 EditText 声明为全局

EditText yardarea , brick , rcc,  overhead , underground;

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    yardarea = (EditText)view.findViewById(R.id.yardarea);
     brick = (EditText)view.findViewById(R.id.brick);
    rcc = (EditText)view.findViewById(R.id.rcc);
    overhead = (EditText)view.findViewById(R.id.overhead);
    underground = (EditText)view.findViewById(R.id.underground);

    Button button = (Button) view.findViewById(R.id.register);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String areaofyard = yardarea.getText().toString();
            String brickused = brick.getText().toString();
            String rccused = rcc.getText().toString();
            String ovhh = overhead.getText().toString();
            String ung = underground.getText().toString();

            DatabaseAccess databaseAccess = DatabaseAccess.getInstance(getActivity().getApplicationContext());
            databaseAccess.open();
            databaseAccess.insertIntoCriteriaTable(areaofyard, brickused, rccused, ovhh, ung );
            databaseAccess.close();

        }
    });
}

【讨论】:

    【解决方案2】:
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    
        final EditText yardarea = (EditText)view.findViewById(R.id.yardarea);
        final EditText brick = (EditText)view.findViewById(R.id.brick);
        final EditText rcc = (EditText)view.findViewById(R.id.rcc);
        final EditText overhead = (EditText)view.findViewById(R.id.overhead);
        final EditText underground = (EditText)view.findViewById(R.id.underground);
    
        Button button = (Button) view.findViewById(R.id.register);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                String areaofyard = yardarea.getText().toString();
                String brickused = brick.getText().toString();
                String rccused = rcc.getText().toString();
                String ovhh = overhead.getText().toString();
                String ung = underground.getText().toString();
    
                DatabaseAccess databaseAccess = DatabaseAccess.getInstance(getActivity().getApplicationContext());
                databaseAccess.open();
                databaseAccess.insertIntoCriteriaTable(areaofyard, brickused, rccused, ovhh, ung );
                databaseAccess.close();
    
            }
        });
    }
    

    您可以将 EditText 对象声明为 final,也可以将它们声明为全局变量,并在单击按钮时使用上面发布的相同代码。

    【讨论】:

      【解决方案3】:

      把获取字符串放在 onClickListener 中怎么样?

      public void onViewCreated(View view, @Nullable Bundle 保存的实例状态){ super.onViewCreated(view, savedInstanceState);

          EditText yardarea = (EditText)view.findViewById(R.id.yardarea);
      
      
      
      
      
          EditText brick = (EditText)view.findViewById(R.id.brick);
      
      
      
          EditText rcc = (EditText)view.findViewById(R.id.rcc);
      
      
      
          EditText overhead = (EditText)view.findViewById(R.id.overhead);
      
      
      
      
          EditText underground = (EditText)view.findViewById(R.id.underground);
      
      
      
      
          Button button = (Button) view.findViewById(R.id.register);
          button.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  String areaofyard = yardarea.getText().toString();
                  String brickused = brick.getText().toString();
                  String rccused = rcc.getText().toString();
                  String ovhh = overhead.getText().toString();
                  String ung = underground.getText().toString();
                  DatabaseAccess databaseAccess = DatabaseAccess.getInstance(getActivity().getApplicationContext());
                  databaseAccess.open();
                  databaseAccess.insertIntoCriteriaTable(areaofyard, brickused, rccused, ovhh, ung );
                  databaseAccess.close();
      
              }
          });
      
      
      
      }
      

      【讨论】:

      • 不可能,因为我们无法在该内部类中获得 yardarea 的引用。
      【解决方案4】:
       You should get the value from edittext inside onClick 
      
      
       final EditText yardarea = (EditText)view.findViewById(R.id.yardarea);
       final EditText brick = (EditText)view.findViewById(R.id.brick);
       final EditText rcc = (EditText)view.findViewById(R.id.rcc);
       final EditText overhead = (EditText)view.findViewById(R.id.overhead);
       final EditText underground = (EditText)view.findViewById(R.id.underground);
      
      
       button.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                    String brickused = brick.getText().toString();
                    String rccused = rcc.getText().toString();
                    String ovhh = overhead.getText().toString();
                    String areaofyard = yardarea.getText().toString();
                    String ung = underground.getText().toString();                  
                    // Do your database operation with these value
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多