2010-12-15 9 views
-1

私は正確にアンドロイド開発者ガイドの例のようitemizedoverlays、と、のMapViewを持っている:itemizedoverlay上http://developer.android.com/resources/tutorials/views/hello-mapview.htmlItemizedOverlayクラスからインテントを開始することは可能ですか? (MapViewのアイテム)

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

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

最初の引数に別のインテントクラスを入れようとすると、私はこのエラーを受け取ります:No enclosing instance of the type AllActivity is accessible in scope ....(AllActivityはpublicです私はこの問題を解決することができますどのように私のアプリのアクティビティクラス)

ここで完全なコード:

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

Intent javadoc明確に最初の引数は、(活動によって拡張)コンテキストと第二1あなたが起動しようとしている活動のクラスであることを有することを示しています。あなたのケースでは、あなたは何をする必要があります:

Intent intent = new Intent(mContext, AllActivity.class); 
mContext.startActivity(intent); 
+0

が解決!どうもありがとう – NullPointerException

3

一般に、インテントは、第1として、第1のパラメータとActivityクラスとしてコンストラクタContextのいずれかになります。だから、次の操作を行います。

Intent intent = new Intent(mContext, AllActivity.class); 
mContext.startActivity(intent); 
+0

それは動作します!しかし、今私は別の問題があります:S ....変数fullName、電子メールとアクセス許可を、そのバンドルで起動する必要がありますが、これらの変数がボタンを押したときにアクセスするとき、これらの変数は存在します...論理的です、これらの変数の値は外部であり、押されたボタンのリスナーが起動されたときに損失です...これらの変数の値をボタンのリスナーで得る方法はありますか? – NullPointerException

+1

ypuは、あなたの意図に対してputExtra()とgetExtras()を使用できます。しかし、答えを正しいとマークし、別の質問をしたり、アクティビティ間のデータパスを検索したりする方が良いでしょう。 –

+1

それは失われていません。 'MyItemizedOverlay.this.name'などを使用してください – Falmarri

0

意図コンストラクタにそれがthisを確認し、このクラスを実装するアプリケーションパッケージのContextを渡す必要があります。それは意図ではありません。
MyItemizedOverlayクラスを使用するアクティビティは、MyClassである必要があります。行うための最善のことは、宣言staticContextmyContextを言うとonCreatemyContext = MyClass.this;としての価値を宣言しています。次に、このような意図を宣言することができます

new Intent (MyClass.myContext , Locate.class); 
関連する問題