Question

I have a very strange problem, I use Inflation to duplicate a layout x times, I have set a value and modify it ( incrementation or decrementation ) Everything is good now, the problem is the variable was global, when I was incrementing or decrementing it.Now he is local in every inflation because I want him to decrement in every inflation. I get strange error when I try to decrement it or increment.

The code is below:

    package com.example.instances_temperature;

import com.example.instances_temperature.R;
//import com.example.instances_temperature.Tabel.RptUpdater;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Build;

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;
    public class yourActivity{
        int counter = 20;

        @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;


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




            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); 
           }*/

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

        }
    }
    }

}

I code error on this part:

                        if(counter<35)
                        {
                        counter++;
                        display.setText( "" + counter+"°C");
                        showup.setText(" "+counter+"°C ");
                        }

when I try to counter ++ I get:

Description Resource    Path    Location    Type
The final local variable counter cannot be assigned, since it is defined in an enclosing type   Tabel.java  /Instances_temperature/src/com/example/instances_temperature    line 71 Java Problem

I have 3 more decrementation or incrementation, this is just an example, if I resolve this I can resolve the other one too.If the all code is needed I will post it.I think this is not about researching, I have tryed some solutions but nothing improved, is about logic of the program.

Thank you for your time.

Was it helpful?

Solution

final int counter = 20;

From inner class you can access variables of outer class.Hence you can use counter.But since you have declared it final you cannot change/increment it.

public class yourActivity{
   int counter = 20;

   protected void onCreate(Bundle savedInstanceState){
    //your Logic
   }

   class RptUpdater implements Runnable{
   //counter logic
   }

}

OTHER TIPS

Instead of

final int counter = 20;

use

int counter = 20;

That's it. A variable which is declared final can not be modified later. It's a constant.

The error message about the enclosing type being the reason is misleading.

This is the reason that keyword final exists in java. The variable is final, i.e. its value cannot be changed. If you have to change the value do not mark variable as final.

or

A variable is declared with final keyword means its value cannot be changed. final variable are like constants.

try below code:-

        int counter = 20;// initialize counter value globally 
        protected void onCreate(Bundle savedInstanceState) {


        class RptUpdater implements Runnable {
            public void run() {
                if( mAutoIncrement && counter < 35){
                    //increment();
                    if(counter<35)
                    {
                    counter++;
                    display.setText( "" + counter+"°C");
                    showup.setText(" "+counter+"°C ");
                    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top