2012-02-28 49 views
-2
public void pickTimeHandler(View target) { 
    Toast.makeText(Alarms1.this, "in PickTimehandler", Toast.LENGTH_LONG).show(); 
    showDialog(0); 

在那裏你看到Alarm1.this總是在我所有的代碼中的錯誤,說 類型Alarms1沒有外圍實例是在範圍訪問鬧鐘應用程序錯誤

+0

請向我們展示您的全班。否則我們猜測。 – 2012-02-28 15:55:19

+0

好吧,如果你不能發佈完整的代碼(它必須是數百或數千行)..你可以在這裏發佈課程的結構嗎?例如顯示類聲明(公共類YourClass),然後顯示任何相關的內部類定義。 – 2012-02-28 16:04:41

回答

1

你會寫,如果Alarms1.this那就是封閉類的名字

這是什麼類的名字?使用該名稱。

例子:

public class Alarms1 {  
    public void pickTimeHandler(View target) { 
    //code below would work, you could also just write "this" instead of "Alarms1.this" 
    Toast.makeText(Alarms1.this, "in PickTimehandler", Toast.LENGTH_LONG).show(); 
    showDialog(0); 
    } 
} 

你只需要使用類的名稱來限定這個值,如果它是從一個內部類製成。

這裏是正在使用的,當你需要的資格是什麼「這個」參數,您的例子:

public class Alarms1 { 
    public void onCreate(Bundle state) { 
     Button button = (Button) findViewById(R.id.set_alarm); 
     button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      Toast.makeText(Alarms1.this, "Button clicked", Toast.LENGTH_LONG).show(); 
     } 
    }); 
    } 
} 

不同的是,在第二個例子中,上面的代碼,你正在創建一個匿名內部類時你把

button.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
      // Perform action on click 
    } 
}); 

,並從該代碼中,如果你寫this Java編譯器/運行時會想你指的內部類的實例(而不是在Alarms1)。

--- UPDATE ---

給你送我的代碼,我想出了這一點:

包com。示例;

import java.util.Calendar; 

import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.Dialog; 
import android.app.PendingIntent; 
import android.app.TimePickerDialog; 
import android.app.TimePickerDialog.OnTimeSetListener; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TimePicker; 
import android.widget.Toast; 

public class AlarmActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

    } 

    public void pickTimeHandler(View target) { 
     Toast.makeText(this, "in PickTimehandler", 
       Toast.LENGTH_LONG).show(); 
     showDialog(0); 
    } 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     Toast.makeText(this, 
       "- onCreateDialog(ID_TIMEPICKER) -", 
       Toast.LENGTH_LONG).show(); 
     final Calendar c = Calendar.getInstance(); 
     int hour = c.get(Calendar.HOUR_OF_DAY); 
     int minute = c.get(Calendar.MINUTE); 
     OnTimeSetListener theTimeSetListener = null; 
     return new TimePickerDialog(this, 
       theTimeSetListener, 
       hour, minute, false); 
    } 

    private TimePickerDialog.OnTimeSetListener theTimeSetListener = new TimePickerDialog.OnTimeSetListener() { 
     @Override 
     public void onTimeSet(TimePicker view, int hour, int minute) { 
      String time = "User picked Hour: " + String.valueOf(hour) + "\n" 
        + "Minute: " + String.valueOf(minute); 
      Toast.makeText(AlarmActivity.this, time, Toast.LENGTH_LONG).show(); 
      int theHour = hour; 
      int theMinute = minute; 

      Intent alarmIntent = new Intent(); 
      alarmIntent.putExtra("nel.example.alarms1", "My message"); 
      Object pendingAlarmIntent = PendingIntent.getService(AlarmActivity.this, 0, 
        alarmIntent, 0); 

      AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

      Calendar AlarmCal = Calendar.getInstance(); 
      AlarmCal.setTimeInMillis(System.currentTimeMillis()); 
      AlarmCal.set(Calendar.HOUR_OF_DAY, theHour); // set user selection 
      AlarmCal.set(Calendar.MINUTE, theMinute); // set user selection 
      AlarmCal.set(Calendar.SECOND, 0); 

      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
        AlarmCal.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, 
        (PendingIntent) pendingAlarmIntent); 
     } 
    }; 

} 

我所做的改變是:

  1. 改名類形式MYMENU到AlarmActivity(類無關了菜單,這是一個報警是吧)。類名也應以大寫字母開頭。
  2. PendingIntent.getService需要一個上下文。這完全是我在原始解決方案中描述的問題。 Activity是Context的子類,這意味着您可以在第一個參數中將活動傳遞給PendingIntent.getService。然而,當你創建了一個內部類:

    私人TimePickerDialog.OnTimeSetListener theTimeSetListener =新TimePickerDialog.OnTimeSetListener(){

內不再是一個活動的代碼,這是一個TimePickerDialog.OnTimeSetListener。您需要傳遞myMenu.this作爲第一個參數(或者在我的情況中,因爲我將您的類重命名爲AlarmActivity,您將傳遞AlarmActivity.this)。在內部類中創建的Toasts也是一樣的。

我強烈建議你在繼續android開發之前停止你正在做的事情並去學java。閱讀一本書,按照在線教程等,但如果你只是不瞭解Java而深入Android,你將會遇到一系列問題。

+0

我不明白你的意思? – user1223679 2012-02-28 15:37:01

+0

哦,所以我把這個放在我的alarams1 java中? – user1223679 2012-02-28 15:39:03

+0

我不知道你應該把它放在哪裏,這取決於你決定(我沒有建立這個程序)。更有可能你應該只是改變Alarms1.this到這 – 2012-02-28 15:45:25