简体   繁体   English

在匿名内部类中访问非最终值

[英]Accessing non-final values inside anonymous inner class

I have these 5 Edittext fields and I want to write these values in database using a button. 我有这5个Edittext字段,我想使用一个按钮在数据库中写入这些值。 For button Clicklistener i've used anonymous inner class but only final values are allowed, that means I will get empty fields while writing in database. 对于按钮Clicklistener,我使用了匿名内部类,但只允许使用最终值,这意味着在数据库中写入时将得到空字段。 How can I access these fields as non-final? 如何以非最终方式访问这些字段? Is there any way? 有什么办法吗?

 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();
        }
    });
}
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();

        }
    });
}

You can just declare the EditText objects as final or you can also declare them as global variables and in onclick of button use the same code posted above. 您可以将EditText对象声明为final,也可以将它们声明为全局变量,并在按钮的onclick中使用上面发布的相同代码。

try this declare EditText as global 试试这个,将EditText声明为global

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();

        }
    });
}

How about putting getting the string in the onClickListener instead? 如何将字符串放入onClickListener中呢?

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); 公共无效onViewCreated(视图视图,@Nullable捆绑保存的instanceState){super.onViewCreated(视图,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(); } }); } 
 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
            }
        });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM