我想创建一个显示谷歌地图的对话框/alerDialog。我创建了一个对话框,在有地图视图但应用程序崩溃的地方放大布局,并给我以下错误:
06-15 10:56:32.436: E/AndroidRuntime(1716): FATAL EXCEPTION: main
06-15 10:56:32.436: E/AndroidRuntime(1716): Process: it.sii.android.jobaroundu, PID: 1716
06-15 10:56:32.436: E/AndroidRuntime(1716): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@52d5318c is not valid; is your activity running?
06-15 10:56:32.436: E/AndroidRuntime(1716): at android.view.ViewRootImpl.setView(ViewRootImpl.java:536)
06-15 10:56:32.436: E/AndroidRuntime(1716): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259)
06-15 10:56:32.436: E/AndroidRuntime(1716): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
06-15 10:56:32.436: E/AndroidRuntime(1716): at android.app.Dialog.show(Dialog.java:286)
06-15 10:56:32.436: E/AndroidRuntime(1716): at it.sii.android.jobaroundu.PaginaRisultati$MyExpandableListAdapter$2.onClick(PaginaRisultati.java:300)
06-15 10:56:32.436: E/AndroidRuntime(1716): at android.view.View.performClick(View.java:4438)
06-15 10:56:32.436: E/AndroidRuntime(1716): at android.view.View$PerformClick.run(View.java:18422)
06-15 10:56:32.436: E/AndroidRuntime(1716): at android.os.Handler.handleCallback(Handler.java:733)
06-15 10:56:32.436: E/AndroidRuntime(1716): at android.os.Handler.dispatchMessage(Handler.java:95)
06-15 10:56:32.436: E/AndroidRuntime(1716): at android.os.Looper.loop(Looper.java:136)
06-15 10:56:32.436: E/AndroidRuntime(1716): at android.app.ActivityThread.main(ActivityThread.java:5017)
06-15 10:56:32.436: E/AndroidRuntime(1716): at java.lang.reflect.Method.invokeNative(Native Method)
06-15 10:56:32.436: E/AndroidRuntime(1716): at java.lang.reflect.Method.invoke(Method.java:515)
06-15 10:56:32.436: E/AndroidRuntime(1716): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
06-15 10:56:32.436: E/AndroidRuntime(1716): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
06-15 10:56:32.436: E/AndroidRuntime(1716): at dalvik.system.NativeStart.main(Native Method)
这是我的活动:
public class PaginaRisultati extends ExpandableListActivity {
//Initialize variables
private static final String STR_CHECKED = " has Checked!";
private static final String STR_UNCHECKED = " has unChecked!";
private int ParentClickStatus=-1;
private int ChildClickStatus=-1;
private ArrayList<Parent> parents;
private String username;
private static final int RECOVERY_DIALOG_REQUEST = 1;
private String regione;
private String provincia;
private String[] tag;
private final static int MAP_MESSAGE_ID = 1;
private final static int PROGRESS_DIALOG_ID = 1;
private String posizione;
private String azienda;
final Context context = this;
MapView mMapView;
GoogleMap mMap;
Marker mark;
Bundle bundle;
double lat;
double lng;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bundle=savedInstanceState;
//setContentView(R.layout.prova_risultati);
MyDBHelper dbHelper2 = new MyDBHelper(this,"JobAroundU_DB", null, 1);
final SQLiteDatabase db2;
Intent dati = getIntent();
String pkg = getPackageName();
regione = dati.getStringExtra(pkg+".Regione");
provincia = dati.getStringExtra(pkg+".Provincia");
tag = dati.getStringArrayExtra(pkg+".Tag");
username=dati.getStringExtra(pkg+".Username");
GetAnnunciThread gat= new GetAnnunciThread(regione, provincia, tag);
gat.run();
gat.start();
try {
gat.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//controllo se risultati esistono --> se non esistono stampo messaggio di errore
Resources res = this.getResources();
Drawable devider = res.getDrawable(R.drawable.transparent);
Drawable group_indicator = res.getDrawable(R.drawable.group_indicator);
// Set ExpandableListView values
getExpandableListView().setGroupIndicator(group_indicator);
getExpandableListView().setDivider(devider);
getExpandableListView().setChildDivider(devider);
getExpandableListView().setDividerHeight(15);
registerForContextMenu(getExpandableListView());
//Creating static data retrived from the result of the thread in arraylist
parents = gat.annuncitrovati;
if (parents.isEmpty()) {
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));
ImageView image = (ImageView) layout.findViewById(R.id.immagine);
image.setImageDrawable(getResources().getDrawable(R.drawable.icon_25761));
TextView text = (TextView) layout.findViewById(R.id.ToastTV);
text.setText("La ricerca non ha prodotto risultati!!");
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
toast.show();
//richiamo activity precedente (la pagina di ricerca del lavoro)
}
db2=dbHelper2.getWritableDatabase();
//metto nella view e stampo a video
// Check for ExpandableListAdapter object
if (this.getExpandableListAdapter() == null) {
//Create ExpandableListAdapter Object
final MyExpandableListAdapter mAdapter = new MyExpandableListAdapter();
// Set Adapter to ExpandableList Adapter
this.setListAdapter(mAdapter);
}
else
{
// Refresh ExpandableListView data
((MyExpandableListAdapter)getExpandableListAdapter()).notifyDataSetChanged();
}
}
private class MyExpandableListAdapter extends BaseExpandableListAdapter
{
private LayoutInflater inflater;
protected SQLiteOpenHelper dbHelper2 =new MyDBHelper(PaginaRisultati.this,"JobAroundU_DB", null, 1);
public MyExpandableListAdapter()
{
// Create Layout Inflator
inflater = LayoutInflater.from(PaginaRisultati.this);
}
// This Function used to inflate parent rows view
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parentView)
{
final Parent parent = parents.get(groupPosition);
// Inflate grouprow.xml file for parent rows
convertView = inflater.inflate(R.layout.grouprow, parentView, false);
// Get grouprow.xml file elements and set values
((TextView) convertView.findViewById(R.id.text1)).setText(parent.getPosizione());
((TextView) convertView.findViewById(R.id.TVData)).setText(parent.getAzienda());
ImageView image=(ImageView)convertView.findViewById(R.id.image_tag);
image.setImageResource(R.drawable.icon_21039);
//ImageView rightcheck=(ImageView)convertView.findViewById(R.id.rightcheck);
final ImageButton imgbtt = (ImageButton)convertView.findViewById(R.id.imageButton1);
imgbtt.setFocusable(false);
//metto stellina colorata se l'annuncio tra i preferiti e se lo metto a false la possibilità di inseririlo tra di essi, evitando cosi' doppioni
SQLiteDatabase db2=dbHelper2.getWritableDatabase();
String sqlPref = "SELECT idDBJobs FROM MyPreferences";
Cursor cursor = db2.rawQuery(sqlPref, null);
boolean prefAnn=false;
while (cursor.moveToNext()){
if(cursor.getString(0).equals(parent.getId())){
imgbtt.setImageResource(R.drawable.yellow_star);
prefAnn=true;
}
}
if(prefAnn==false){
imgbtt.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Log.i("preferred job announce", "aggiungi ai preferiti INIZIO ");
//preferiti e ricerche recenti sono nel DB SQLite dell'app
int num = Integer.parseInt(parent.getId());
String sqlMyPreference="INSERT INTO MyPreferences (Position, Firm, Description, idDBJobs ) VALUES ('"+parent.getPosizione()+"', '"+parent.getAzienda()+"', '"+parent.getChildren().get(0).getDescrizione()+"', "+num+");";
SQLiteDatabase db2=dbHelper2.getWritableDatabase();
db2.execSQL(sqlMyPreference);
db2.close();
Log.i("preferred job announce", "Aggiunto " +parent.getPosizione()+" nell'azienda "+parent.getAzienda()+" ai preferiti");
imgbtt.setImageResource(R.drawable.yellow_star);
}
});
}
return convertView;
}
// This Function used to inflate child rows view
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parentView)
{
final Parent parent = parents.get(groupPosition);
final Child child = parent.getChildren().get(childPosition);
// Inflate childrow.xml file for child rows
convertView = inflater.inflate(R.layout.childrow, parentView, false);
// Get childrow.xml file elements and set values
/***INDIRIZZO***/
((TextView) convertView.findViewById(R.id.TVTags)).setText(child.getIndirizzo());
ImageView image=(ImageView)convertView.findViewById(R.id.image_tag);
image.setImageResource(R.drawable.icon_14236);
Button b0 = (Button) convertView.findViewById(R.id.button1);
if(child.getIndirizzo().equals("Indirizzo NON presente")){
b0.setVisibility(View.INVISIBLE);
}
b0.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//recupero indirizzo
String indirizzodaconvertire= ""+child.getIndirizzo();
azienda=""+parent.getAzienda();
posizione = ""+parent.getPosizione();
LayoutInflater inflater = getLayoutInflater();
//final View view =inflater.inflate(R.layout.main_mapview, null);
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.main_mapview);
mMapView = (MapView) dialog.findViewById(R.id.mymapview);
mMapView.onCreate(bundle);
MapsInitializer.initialize(context);
if (mMap == null) {
mMap = mMapView.getMap();
if (mMap != null) {
}
}
TextView tv= (TextView) dialog.findViewById(R.id.addressName);
tv.setText(indirizzodaconvertire);
searchPlace(indirizzodaconvertire);
dialog.setTitle("MAPPA!!!");
dialog.show();
//}
// });
/* Intent i = new Intent(PaginaRisultati.this, SeeAddress.class);
i.putExtra(getPackageName()+".Address", indirizzodaconvertire);
i.putExtra(getPackageName()+".Azienda",azienda);
i.putExtra(getPackageName()+".Posizione", posizione);
i.putExtra(getPackageName()+".Regione", regione);
i.putExtra(getPackageName()+".Provincia", provincia);
i.putExtra(getPackageName()+".Tag", tag);
i.putExtra(getPackageName()+".Username", username);
startActivity(i);*/
//replaceContentView("aa", i);
}
});
/***LUOGO LAVORO ****/
((TextView) convertView.findViewById(R.id.TVLoc_prov)).setText(child.getLuogoLavoro());
/***DESCRIZIONE ****/
((TextView) convertView.findViewById(R.id.TVLoc_regione)).setText(child.getDescrizione());
ImageView image2=(ImageView)convertView.findViewById(R.id.ImageLoc);
image2.setImageResource(R.drawable.icon_16301);
/***STIPENDIO ****/
((TextView) convertView.findViewById(R.id.TWStipendio)).setText(child.getStipendio());
ImageView image3=(ImageView)convertView.findViewById(R.id.ImageStipendio);
image3.setImageResource(R.drawable.icon_21213);
/***CANDIDATURA CELLULARE ****/
((TextView) convertView.findViewById(R.id.TWCandCell)).setText(child.getCandidaturaCellulare());
ImageView image4=(ImageView)convertView.findViewById(R.id.ImageCandCell);
image4.setImageResource(R.drawable.icon_14583);
/**** EMAIL ****/
TextView tv= (TextView) convertView.findViewById(R.id.TWMail);
tv.setText(child.getEmail());
ImageView image5=(ImageView)convertView.findViewById(R.id.ImageMail);
image5.setImageResource(R.drawable.icon_98);
Linkify.addLinks(tv, Linkify.EMAIL_ADDRESSES);
/*** BOTTONE YOUTUBE ***/
Button b1 = (Button) convertView.findViewById(R.id.Button01);
b1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(child.getYT().equals("Video non presente")){
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));
ImageView image = (ImageView) layout.findViewById(R.id.immagine);
image.setImageDrawable(getResources().getDrawable(R.drawable.youtube_notfind));
TextView text = (TextView) layout.findViewById(R.id.ToastTV);
text.setText("Video non presente!");
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
toast.show();
}else{
//Intent i = new Intent(PaginaRisultati.this, YTActivity.class);
Intent i = new Intent(PaginaRisultati.this, YouTubeDialogActivity.class);
i.putExtra(getPackageName()+".YTV", child.getYT());
i.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
startActivity(i);
}
}
});
/***BOTTONE visibile solo se possible inviare candidatura via cell****/
Button b = (Button) convertView.findViewById(R.id.candidati);
if(child.getCandidaturaCellulare().equals("Candidatura via cellulare possibile")==false){
//nascondo bottone se non e' possibile inviare candidatura
b.setVisibility(View.INVISIBLE);
}
//CODICE PER INVIARE LA MAIL --> apre nuova activity con dati del lavoro--> email destinatario gia' inserita, allegato da scegliere e messaggio da editare
b.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
PersonalDataThread t3 = new PersonalDataThread(username);
t3.run();
t3.start();
try {
t3.join();
} catch (InterruptedException e) {
Log.e("ERROR -PERSONALDATA", ""+e.toString());
}
Intent ii= new Intent (PaginaRisultati.this, MailActivity.class);
ii.putExtra(getPackageName()+".EmailReceiver", child.getEmail());
ii.putExtra(getPackageName()+".Posizione", parent.getPosizione());
ii.putExtra(getPackageName()+".NomeUser", t3.nomeDB);
ii.putExtra(getPackageName()+".CognomeUser", t3.cognomeDB);
ii.putExtra(getPackageName()+".EmailSender", t3.mailDB);
ii.putExtra(getPackageName()+".Azienda", parent.getAzienda());
startActivity(ii);
}
});
return convertView;
}
@Override
public Object getChild(int groupPosition, int childPosition)
{
//Log.i("Childs", groupPosition+"= getChild =="+childPosition);
return parents.get(groupPosition).getChildren().get(childPosition);
}
//Call when child row clicked
@Override
public long getChildId(int groupPosition, int childPosition)
{
/****** When Child row clicked then this function call *******/
if( ChildClickStatus!=childPosition)
{
ChildClickStatus = childPosition;
}
return childPosition;
}
@Override
public int getChildrenCount(int groupPosition)
{
int size=0;
if(parents.get(groupPosition).getChildren()!=null)
size = parents.get(groupPosition).getChildren().size();
return size;
}
@Override
public Object getGroup(int groupPosition)
{
Log.i("Parent", groupPosition+"= getGroup ");
return parents.get(groupPosition);
}
@Override
public int getGroupCount()
{
return parents.size();
}
//Call when parent row clicked
@Override
public long getGroupId(int groupPosition)
{
ParentClickStatus=groupPosition;
if(ParentClickStatus==0)
ParentClickStatus=-1;
return groupPosition;
}
@Override
public void notifyDataSetChanged()
{
// Refresh List rows
super.notifyDataSetChanged();
}
@Override
public boolean isEmpty()
{
return ((parents == null) || parents.isEmpty());
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition)
{
return true;
}
/******************* Checkbox Checked Change Listener ********************/
private final class CheckUpdateListener implements OnCheckedChangeListener
{
private final Parent parent;
private CheckUpdateListener(Parent parent)
{
this.parent = parent;
}
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
Log.i("onCheckedChanged", "isChecked: "+isChecked);
parent.setChecked(isChecked);
((MyExpandableListAdapter)getExpandableListAdapter()).notifyDataSetChanged();
final Boolean checked = parent.isChecked();
}
}
/***********************************************************************/
@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return false;
}
}
public void searchPlace(String inputName) {
final String s = inputName;
Thread searchThread = new Thread("SerachThread") {
@Override
public void run() {
Message message = mapHandler.obtainMessage();
String addressToSearch = s;
addressToSearch = addressToSearch.replace(" ", "%20");
JSONObject addressInfo = getAddressInfo(addressToSearch);
try
{
if (addressInfo != null && addressInfo.getString("status").equals("OK")) {
message.obj = addressInfo;
mapHandler.sendMessage(message);
}
else
mapHandler.sendEmptyMessage(MAP_MESSAGE_ID);
}
catch(JSONException e){
mapHandler.sendEmptyMessage(MAP_MESSAGE_ID);
}
//dismissDialog(PROGRESS_DIALOG_ID);
}
};
//showDialog(PROGRESS_DIALOG_ID);
//searchThread.run();
searchThread.start();
while(searchThread.isAlive()){
}
}
private final Handler mapHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg!=null && msg.obj!=null){
JSONObject addressInfo = (JSONObject)msg.obj;
try{
lng = ((JSONArray)addressInfo.get("results")).getJSONObject(0).getJSONObject("geometry").getJSONObject("location").getDouble("lng");
lat = ((JSONArray)addressInfo.get("results")).getJSONObject(0).getJSONObject("geometry").getJSONObject("location").getDouble("lat");
MarkerOptions mo= new MarkerOptions();
mo.position(new LatLng(lat,lng))
.title(posizione)
.snippet(azienda)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat,lng), 16.0f));
mark = mMap.addMarker(mo);
//onMarkerClick(mark);
mMap.setOnMarkerClickListener(new OnMarkerClickListener(){
@Override
public boolean onMarkerClick(final Marker marker){
// This causes the marker to bounce into position when it is clicked.
if (marker.equals(mark)) {
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
Projection proj = mMap.getProjection();
Point startPoint = proj.toScreenLocation(new LatLng(lat,lng));
startPoint.offset(0, -100);
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final long duration = 2000;
final Interpolator interpolator = new BounceInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed / duration);
double lng1 = t * lng + (1 - t) * startLatLng.longitude;
double lat1 = t * lat + (1 - t) * startLatLng.latitude;
marker.setPosition(new LatLng(lat1, lng1));
if (t < 1.0) {
// Post again 16ms later.
handler.postDelayed(this, 10);
}
}
});
}
// We return false to indicate that we have not consumed the event and that we wish
// for the default behavior to occur (which is for the camera to move such that the
// marker is centered and for the marker's info window to open, if it has one).
return false;
}
});
}
catch(JSONException e){
Toast.makeText(context, "Found nothing. Retry!",
Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(context, "Found nothing. Retry!",
Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case PROGRESS_DIALOG_ID:
ProgressDialog progressDialog = new ProgressDialog(this,
ProgressDialog.STYLE_SPINNER);
progressDialog.setIndeterminate(true);
progressDialog.setTitle("GeocodingTest");
progressDialog.setMessage("Searching...");
return progressDialog;
default:
return null;
}
}
public static JSONObject getAddressInfo(String sAddress) {
HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?address=" + sAddress + "&sensor=false");
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();
try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int b;
while ((b = stream.read()) != -1) {
stringBuilder.append((char) b);
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
JSONObject jsonObject = new JSONObject();
try {
jsonObject = new JSONObject(stringBuilder.toString());
Log.d("Google Geocoding Response", stringBuilder.toString());
} catch (JSONException e) {
e.printStackTrace();
}
return jsonObject;
}
/**
//CARICO LA NUOVA ACTIVITY ALL'INTERNO DEL CORPO DEL TAB
public void replaceContentView(String id, Intent newIntent) {
this.getApplicationContext()
View view =this.getApplication().getLocalActivityManager().startActivity("ff",
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
.getDecorView();
this.setContentView(view);
}
*/
}
这是布局膨胀的
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:id="@+id/mainLayout">
<LinearLayout android:layout_height="wrap_content"
android:id="@+id/buttonLayout" android:layout_width="fill_parent">
<TextView android:id="@+id/addressName"
android:layout_height="wrap_content" android:layout_width="fill_parent"
android:layout_weight="1" android:inputType="text"></TextView>
<!-- <Button android:layout_height="wrap_content" android:id="@+id/searchButton"
android:text="Search" android:layout_width="fill_parent"
android:onClick="searchPlace"
android:layout_weight="3"></Button> -->
</LinearLayout>
<com.google.android.gms.maps.MapView
android:id="@+id/mymapview"
android:layout_width="500dp"
android:layout_height="500dp"
xmlns:map="http://schemas.android.com/apk/res-auto"
map:cameraTargetLat="45.070139"
map:cameraTargetLng="7.6700892"
map:cameraZoom="5"
map:mapType="normal"
map:uiRotateGestures="false"
map:uiScrollGestures="true"
map:uiTiltGestures="false"
map:uiZoomControls="true"
map:uiZoomGestures="false"
>
</com.google.android.gms.maps.MapView>
</LinearLayout>
错误在哪里?求你了,你能帮我纠正我的代码吗?
感谢
M
android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@52d5318c is not valid; is your activity running?
你需要
Context context; //declare it as an instance variable
然后在创建
context = this; // initialize in onCreate. this refers to activity context
创建"活动"后,"活动上下文"可用。
对于地图,您可以使用DialogFragment