-1

Android開発者ガイドの例とまったく同じように、itemizedoverlaysを備えたマップビューがあります: http://developer.android.com/resources/tutorials/views/hello-mapview.html

itemizedoverlay には、ボタン付きのパーソナライズされたダイアログがあります。ここまでは問題ありませんが、ボタンに機能を追加しようとすると問題が発生します。ボタンの開始が新しいアクティビティである必要がありますが、それを達成できません.... ¿ この行でi = new Intent (NyItemizedOverlay.class, Locate.class);は、最初のパラメーターとして現在のインテント クラスがあり、2 番目のパラメーターにターゲット インテント クラスがあるためです。

MyItemizedOverlay は Intent クラスではありません... ItemizedOverlay 拡張機能です。インテントを起動しようとするとコンパイルされません。通常のクラスを最初の引数として渡そうとしていますが、インテント クラスが必要です。ランチャークラスを配置する必要がありますが、ランチャークラスはインテントではありません:S

最初の引数に別のインテント クラスを配置しようとすると、次のエラーが発生しました: No enclosing instance of the type AllActivity is accessible in scope .... (AllActivity はアプリのパブリック アクティビティ クラスです)

どうすればこれを解決できますか?

ここに完全なコード:

public class MyItemizedOverlay extends ItemizedOverlay {


 private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
 private ArrayList<String> permissions = new ArrayList<String>();
 private Context mContext;

 public MyItemizedOverlay(Drawable defaultMarker) {
  super(boundCenterBottom(defaultMarker));
 }

 protected OverlayItem createItem(int i) {
   return mOverlays.get(i);
 }

 public int size() {
   return mOverlays.size();
 }

 public void addOverlay(OverlayItem overlay) {
     mOverlays.add(overlay);
     populate();
 }
 public void addOverlay(OverlayItem overlay,String permission) {
     mOverlays.add(overlay);
     permissions.add(permission);
     populate();
 }

 public MyItemizedOverlay(Drawable defaultMarker, Context context) {
    //super(defaultMarker);
    super(boundCenterBottom(defaultMarker));
    mContext = context;
 }
 public void clear()
 {
  mOverlays.clear();
  permissions.clear();//lista de permisos de cada usuario, ya que hay dos campos, el email (snippet) y el permission, una lista.
 }

 protected boolean onTap(int index) {
   try{
    OverlayItem item = mOverlays.get(index);
    if (permissions.size()==0)
    {     
     AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
     dialog.setTitle(item.getTitle());
     dialog.setMessage(item.getSnippet());
     dialog.show();
    }
    else
    {

    //set up dialog
    Dialog dialog = new Dialog(mContext);
    dialog.setContentView(R.layout.personal_dialog);
    dialog.setTitle(item.getTitle());
    dialog.setCancelable(true);
    //there are a lot of settings, for dialog, check them all out!


    //set up text
    TextView DialogEmail = (TextView) dialog.findViewById(R.id.DialogEmail);
    TextView DialogPermission = (TextView) dialog.findViewById(R.id.DialogPermission);
    DialogEmail.setText(item.getSnippet());
    DialogPermission.setText(permissions.get(index));

    final String userName=item.getTitle();
    final String email=item.getSnippet();
    final int cont=index;
    //set up button
    Button button = (Button) dialog.findViewById(R.id.DialogButton);
    button.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {
      //do something
      Bundle bundle = new Bundle(); //bundle is like the letter
      bundle.putString ("user",userName ); //arg1 is the keyword of the txt, arg2 is the txt
            bundle.putString ("email", email);
            bundle.putString ("permission", permissions.get(cont));
            Intent i=null;

             i = new Intent (MyItemizedOverlay.class, Locate.class);

            i.putExtras(bundle);
            startActivity(i);
     }
    });
    //now that the dialog is set up, it's time to show it    
    dialog.show();

    }
   }catch(Exception e){}
   return true;
 }


}
4

3 に答える 3

4

Intent javadocは、最初の引数がコンテキスト (アクティビティによって拡張される) であり、2 番目の引数が起動しようとしているアクティビティのクラスである必要があることを明確に示しています。あなたの場合、次のことを行う必要があります。

Intent intent = new Intent(mContext, AllActivity.class);
mContext.startActivity(intent);
于 2010-12-15T14:21:25.243 に答える
3

通常、Intentは、コンストラクターの1つをContext最初のパラメーターとして取得し、Activityクラスを2番目のパラメーターとして取得します。したがって、次のようにします。

Intent intent = new Intent(mContext, AllActivity.class);
mContext.startActivity(intent);
于 2010-12-15T14:19:04.950 に答える
0

インテントコンストラクタにContext、このクラスを実装するアプリケーションパッケージのAを渡す必要があります。これを確認してください。それは意図ではありません。MyItemizedOverlayクラスを使用する
など、何らかのアクティビティである必要があります。MyClass最善の方法は、そこでstatic Context発言myContextを宣言し、その値をのようmyContext = MyClass.this;に宣言することonCreateです。次に、このように意図を宣言できます

 new Intent (MyClass.myContext , Locate.class);
于 2010-12-15T14:34:53.150 に答える