2013-12-26 3 views
1

Я пытаюсь написать приложение, которое некоторые маркеры на Картах Google. Когда точка нажимается долго на карте, появляется диалоговое окно, в котором пользователь вводит информацию о точке. Затем эта информация будет отображаться в информационном окне маркера.Пауза до завершения работы функции

Для кода, который я написал, когда долго нажата точка, запускается showEditDialog(), и появляется диалоговое окно, но приложение не ждет ввода пользователем информации и нажмите OK перед запуском остальной части кода в OnMapLongClick. Это означает, что новые добавленные точки не имеют этой информации, потому что приложение пытается загрузить данные из SharedPreferences до его сохранения, но информация появляется, когда приложение перезагружается и все маркеры перезагружаются. Как это исправить?

Основная деятельность:

mMap.setOnMapLongClickListener(new OnMapLongClickListener() { 

     @Override 
     public void onMapLongClick(LatLng point) { 

      sharedPreferences = getSharedPreferences("location", 0); 
      int locationCount = sharedPreferences.getInt("locationCount", 0); 

      showEditDialog(); 

      locationCount++; 

      String name = sharedPreferences.getString("name"+Integer.toString(locationCount-1), null); 
      String url = sharedPreferences.getString("url"+Integer.toString(locationCount-1), null); 
      // Drawing marker on the map 
      mMap.addMarker(new MarkerOptions() 
       .position(point) 
       .title(name) 
       .snippet(url) 
      ); 

      /** Opening the editor object to write data to sharedPreferences */ 
      SharedPreferences.Editor editor = sharedPreferences.edit(); 

      // Storing the latitude for the i-th location 
      editor.putString("lat"+ Integer.toString((locationCount-1)), Double.toString(point.latitude)); 

      // Storing the longitude for the i-th location 
      editor.putString("lng"+ Integer.toString((locationCount-1)), Double.toString(point.longitude)); 

      // Storing the count of locations or marker count 
      editor.putInt("locationCount", locationCount); 

      /** Saving the values stored in the shared preferences */ 
      editor.commit(); 

      Toast.makeText(getBaseContext(), "New Camera Added!", Toast.LENGTH_SHORT).show(); 

     } 
    }); 
} 

private void showEditDialog() { 
    FragmentManager fm = getSupportFragmentManager(); 
    AddCamDialog addCamDialog = new AddCamDialog(); 
    addCamDialog.show(fm, "fragment_newcam"); 
} 


@Override 
public void onFinishEditDialog1(String EditText1) { 
    sharedPreferences = getSharedPreferences("location", 0); 
    int locationCount = sharedPreferences.getInt("locationCount", 0); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putString("name"+ Integer.toString((locationCount-1)), EditText1); 
    editor.commit(); 
} 

@Override 
public void onFinishEditDialog2(String EditText2) { 
    sharedPreferences = getSharedPreferences("location", 0); 
    int locationCount = sharedPreferences.getInt("locationCount", 0); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putString("url"+ Integer.toString((locationCount-1)), EditText2); 
    editor.commit(); 
} 

Dialog класс:

public class AddCamDialog extends DialogFragment { 

    public interface AddCamDialogListener { 
     void onFinishEditDialog1(String EditText1); 
     void onFinishEditDialog2(String EditText2); 
    } 


    private EditText EditText1; 
    private EditText EditText2; 

    public AddCamDialog() { 
     // Empty constructor required for DialogFragment 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle(R.string.title_NewCamera); 

     View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_newcam, null); 
     EditText1 = (EditText) view.findViewById(R.id.cam_name); 
     EditText2 = (EditText) view.findViewById(R.id.cam_URL); 

     builder.setView(view); 

     builder.setPositiveButton(R.string.PositiveButton, new DialogInterface.OnClickListener() { 
      //@Override 
      public void onClick(DialogInterface dialog, int which) { 
       AddCamDialogListener activity = (AddCamDialogListener) getActivity(); 
       activity.onFinishEditDialog1(EditText1.getText().toString()); 
       activity.onFinishEditDialog2(EditText2.getText().toString()); 

       dialog.cancel(); 
      } 
     }); 

     builder.setNegativeButton(R.string.NegativeButton, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 

     return builder.create(); 

    } 
} 

ответ

2

Поскольку эти операции являются асинхронными, вы должны инициировать каждый этап согласно соответствующему событию, которое в данном случае является отделка , поэтому поставьте код, который должен быть выполнен только после того, как диалог отклоняется в onFinishEditDialog1/onFinishEditDialog2, а не сразу после звонка showEditDialog

+0

Каков наилучший способ получить latlng точки, если я поместил код в onFinishEditDialog1/onFinishEditDialog2? Сначала я сохраняю его в SharedPreferences, а затем загружаю его оттуда? – user3106498

+0

Это зависит от вас, если после этого вам это не понадобится, вам не нужно сохранять его в общих настройках. Кроме того, вы можете уменьшить его до одного обратного вызова с двумя параметрами ... – MByD

Смежные вопросы