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;