Android应用程序不能引用非最终变量,但不想让它成为最终变量

时间:2021-09-22 21:18:29

Hello * users,

你好*用户,

I have a problem, I have a variable named counter that is inscrementing or decrementing by 2 buttons, this variable is displayed with 2 TextViews.The problem is that the variable need to be setted local not global ( global is working, but I use inflation to duplicate the layer many times, if he is global, when I increment or decrement the value of a layout he modify in every layout )

我有一个问题,我有一个名为counter的变量,它是由两个按钮决定的,这个变量用两个textview显示。问题是这个变量需要设置为局部而不是全局(全局是有效的,但是我多次使用通胀来复制层,如果他是全局的,当我在每个布局中增加或减少布局的值时,他会修改)

The error is this:

错误的是:

Description Resource    Path    Location    Type
Cannot refer to a non-final variable counter inside an inner class defined in a different method    Tabel.java  /Instances_temperature/src/com/example/instances_temperature    line 67 Java Problem

Line 67 would be this:

第67行是:

if( mAutoIncrement && counter < 35)

if(mAutoIncrement && counter < 35)

If I set the variable final it can't be accesed by decrementing ( counter-- ) or incrementing ( counter++ )

如果我将变量设置为final则不能通过递减(counter-)或递增(counter+)来适应

Hope I explained the program how it work for the moment, thank you for your helping.

希望我现在能解释一下这个程序是如何工作的,谢谢你的帮助。

Below is my code of the java file:

下面是我的java文件代码:

public class Tabel extends ActionBarActivity {

    int i;

    int value; // Ignore this, this is the number that is taked from mainactivity for Inflation
    //int counter=20; // counter default value for start = 20

    static int REP_DELAY = 50; // Constant value for long click update
    private Handler repeatUpdateHandler = new Handler();
    private boolean mAutoIncrement = false;
    private boolean mAutoDecrement = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tabel);
        Intent intentObject = getIntent();
        value = intentObject.getIntExtra("max", 0);
        LinearLayout layout = (LinearLayout)findViewById(R.id.container2);


        for(i=1;i<=value;i++)
        {
            LayoutInflater layoutinflate = null; 
            layoutinflate = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
            final View rowview = layoutinflate.inflate( R.layout.inflation_layout, null);

            Button add,sub;
            final TextView display;
            final TextView showup;

            int counter = 20;

            add = (Button) rowview.findViewById(R.id.plus);
            sub = (Button) rowview.findViewById(R.id.minus);
            display = (TextView) rowview.findViewById(R.id.showtemp);
            showup = (TextView) rowview.findViewById(R.id.showvalue);

            class RptUpdater implements Runnable {
                public void run() {
                    if( mAutoIncrement && counter < 35){
                        //increment();
                        if(counter<35)
                        {
                        counter++;
                        display.setText( "" + counter+"°C");
                        showup.setText(" "+counter+"°C ");
                        }
                        else
                        {
                            Context context = getApplicationContext();
                            CharSequence text = "Maximum value is 35°C!";
                            int duration = Toast.LENGTH_SHORT;
                            final Toast toast = Toast.makeText(context, text, duration);
                            toast.show();
                            toast.setGravity(Gravity.TOP, 0, 100);
                        }
                        repeatUpdateHandler.postDelayed( new RptUpdater(), REP_DELAY );
                    } 
                    else

                        if( mAutoDecrement && counter > 10){
                       // decrement();
                            if(counter>10)
                            {
                            counter--;
                            display.setText( "" + counter+"°C");
                            showup.setText(" "+counter+"°C ");
                            repeatUpdateHandler.postDelayed( new RptUpdater(), REP_DELAY );
                            }
                            else
                            {
                                Context context = getApplicationContext();
                                CharSequence text = "Minimum value is 10°C!";
                                int duration = Toast.LENGTH_SHORT;
                                final Toast toast = Toast.makeText(context, text, duration);
                                toast.show();
                                toast.setGravity(Gravity.BOTTOM, 0, 50);
                            }
                        }

                }
            }


            showup.setText(" "+counter+"°C ");
            display.setText(""+counter+"°C");
            add.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
            if(counter<35){
                counter++;
                display.setText( "" + counter+"°C ");
                showup.setText(" "+counter+"°C ");
                }
            else{
                Context context = getApplicationContext();
                CharSequence text = "Maximum value is 35°C!";
                int duration = Toast.LENGTH_SHORT;
                final Toast toast = Toast.makeText(context, text, duration);
                toast.show();
                toast.setGravity(Gravity.TOP, 0, 100);
                }
            }
        });

        sub.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

            if(counter>10){
                counter--;
                display.setText( "" + counter+"°C");
                showup.setText(" "+counter+"°C ");
                }
            else{
                Context context = getApplicationContext();
                CharSequence text = "Minimum value is 10°C!";
                int duration = Toast.LENGTH_SHORT;
                final Toast toast = Toast.makeText(context, text, duration);
                toast.show();
                toast.setGravity(Gravity.BOTTOM, 0, 50);
            }
            }

        });
        add.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                mAutoIncrement = true;
                repeatUpdateHandler.post(new RptUpdater() );
                return false;
            }
        });
        add.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                if( (event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL) && mAutoIncrement )
                    mAutoIncrement = false;
                    return false;
            }
        });
        sub.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                mAutoDecrement = true;
                repeatUpdateHandler.post(new RptUpdater() );
                return false;
            }
        });
        sub.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                if( (event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL) && mAutoDecrement )
                    mAutoDecrement = false;
                    return false;
            }
        });



            layout.addView(rowview);
        }



        //showvalue.setText(String.valueOf(getIntent().getExtras().getInt("max")));


        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment()).commit();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.tabel, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_tabel,
                    container, false);
            return rootView;
        }
    }

    protected void onSaveInstanceState(Bundle savedInstance) {
           super.onSaveInstanceState(savedInstance); 
           //savedInstance.putInt("myCounter",counter); 
           }

}

4 个解决方案

#1


2  

If you want a dirty fix. Make counter a final int[] counter = {20} and then when you want to access it just call counter[0]

如果你想要一个肮脏的解决办法。将计数器设置为最终的int[] counter ={20},当你想访问它时,只需调用counter[0]

#2


0  

Use AtomicInteger rather than int. This means you can set the variable to be final, and still increment it by calling methods on it.

使用AtomicInteger而不是int.这意味着您可以将变量设置为final,并通过调用它的方法来增加它。

#3


0  

it is the Java specification. why not keep a "counter" filed in RptUpdater class.

这是Java规范。为什么不在RptUpdater类中保存一个“计数器”呢?

#4


0  

the variables that you want to use , which android says to make it final . declare those variables here. than android will not give warning to make it as final

你想要使用的变量,安卓说这是最终的。声明这些变量。而android不会给出警告,让它成为最终决定

public class Tabel extends ActionBarActivity {


int counter = 20;
TextView display;
TextView showup;

#1


2  

If you want a dirty fix. Make counter a final int[] counter = {20} and then when you want to access it just call counter[0]

如果你想要一个肮脏的解决办法。将计数器设置为最终的int[] counter ={20},当你想访问它时,只需调用counter[0]

#2


0  

Use AtomicInteger rather than int. This means you can set the variable to be final, and still increment it by calling methods on it.

使用AtomicInteger而不是int.这意味着您可以将变量设置为final,并通过调用它的方法来增加它。

#3


0  

it is the Java specification. why not keep a "counter" filed in RptUpdater class.

这是Java规范。为什么不在RptUpdater类中保存一个“计数器”呢?

#4


0  

the variables that you want to use , which android says to make it final . declare those variables here. than android will not give warning to make it as final

你想要使用的变量,安卓说这是最终的。声明这些变量。而android不会给出警告,让它成为最终决定

public class Tabel extends ActionBarActivity {


int counter = 20;
TextView display;
TextView showup;