【问题标题】:Cannot refer to a non-final variable timePicker inside an inner class defined in a different method.where is the inner class??不能在不同方法中定义的内部类中引用非最终变量 timePicker。内部类在哪里?
【发布时间】:2011-08-06 04:38:33
【问题描述】:
      public class MainActivity extends Activity {
 TimePicker timePicker;

     /** Called when the activity is first created. */
     @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

   TimePicker timePicker = (TimePicker)findViewById(R.id.timePicker);
    timePicker.setIs24HourView(true);

    //--Button view---
    Button btnOpen = (Button)findViewById(R.id.btnSet);
    btnOpen.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v)
        {
            Toast.makeText(getBaseContext(),
                    "Time selected:" + 
                    timePicker.getCurrentHour() + 
                    ":" + timePicker.getCurrentMinute(),
                    Toast.LENGTH_SHORT).show();
                       }
                 });
             }
           }




       somebody  explain me plz ? 

【问题讨论】:

    标签: android inner-classes


    【解决方案1】:
    public class MainActivity extends Activity {
    TimePicker timePicker;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    TimePicker timePicker = (TimePicker)findViewById(R.id.timePicker);
    timePicker.setIs24HourView(true);
    
    //--Button view---
    Button btnOpen = (Button)findViewById(R.id.btnSet);
    btnOpen.setOnClickListener(new OnClickListener() // <------- Inner class
    {
        public void onClick(View v)
        {
            Toast.makeText(getBaseContext(),
                    "Time selected:" + 
                    timePicker.getCurrentHour() + 
                    ":" + timePicker.getCurrentMinute(),
                    Toast.LENGTH_SHORT).show();
        }
     });
    

    您正在创建一个匿名类,该类通过提供 onClick 方法扩展抽象 OnClickListenerClass。

    要修复,请将 timePicker 声明为 final

    final TimePicker timePicker = (TimePicker)findViewById(R.id.timePicker);
    

    【讨论】:

    • 但是如果我从代码中删除 TimePicker TimePicker timePicker = (TimePicker)findViewById(R.id.timePicker); timePicker.setIs24HourView(true);代码正在运行,无需声明为最终...这是怎么回事..?你能解释一下吗...?
    • 只需在 onCreate 方法的声明前添加 final 即可。 删除本地声明并使用您的成员变量(也具有相同的名称...timePicker)。
    • 您有两个 timePicker 变量 - 一个在 onCreate 中声明的局部范围的变量和一个成员变量(“包”范围是因为您没有指定私有或公共 - 这并不重要这里)变体。很有可能,您的 OnClickListener 实例的 onClick 方法正在调用成员变量,因为它看不到 onCreate 的本地变量。跨度>
    猜你喜欢
    • 2010-11-20
    • 2014-12-09
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多