2016-03-03 26 views
1

我有一個名爲getCustomAddress()的方法,該方法應該顯示一個AlertDialog,並保存用戶輸入的地址。此方法似乎在方法getTransportType()getGoogleDirections之後執行。我希望getCustomAddress在這些其他方法之前執行並顯示AlertDialog顯示AlertDialog的方法似乎正在執行錯誤

Alert Dialog to get custom address

我沒有通過這些方法與調試步驟。 #2的if語句事實上根據調試器評估爲真(當我從微調器/下拉菜單中選擇「Custom」時)。

launchMapButton.setOnClickListener(new Button.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      //1. Find out where user wants to go 
      getDestination(addressFieldSpinner); 

      //2. Check for custom address 
      if (address.equals("Custom")) { 
       getCustomAddress(); 
      } 

      //3. Find out what transportation method user wants 
      GetTransportType(googTransitButton, googBikeButton, googDrivingButton, googWalkingButton); 

      //4. Get directions from Google Maps 
      getGoogleDirections(mode); 

     } 
    }); 

這裏是整個MainActivity.java文件:

public class MainActivity extends Activity { 
    private String friendlyLocation = ""; 
    private String address = ""; 
    private String mode = "@mode=d"; //mode b is bicycling, mode d is for driving, mode t is for transit, mode w is for walking 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final Spinner addressFieldSpinner = (Spinner) findViewById(R.id.dropdownEditText); 
     final Button launchMapButton = (Button) findViewById(R.id.launchMapButton); 
     final RadioButton googTransitButton = (RadioButton) findViewById(R.id.googTransitButton); 
     final RadioButton googBikeButton = (RadioButton) findViewById(R.id.googBicycleButton); 
     final RadioButton googDrivingButton = (RadioButton) findViewById(R.id.googDrivingButton); 
     final RadioButton googWalkingButton = (RadioButton) findViewById(R.id.googWalkButton); 
     final Button exitButton = (Button)findViewById(R.id.exit_button); 


     // Create an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
       R.array.locations_array, android.R.layout.simple_spinner_item); 
     // Specify the layout to use when the list of choices appears 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     // Apply the adapter to the spinner 
     addressFieldSpinner.setAdapter(adapter); 

     launchMapButton.setOnClickListener(new Button.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       //1. Find out where user wants to go 
       getDestination(addressFieldSpinner); 

       //2. Check for custom address 
       if (address.equals("Custom")){ 
        getCustomAddress(); 
       } 

        //3. Find out what transportation method user wants 
        GetTransportType(googTransitButton, googBikeButton, googDrivingButton, googWalkingButton); 

        //4. Get directions from Google Maps 
        getGoogleDirections(mode); 

      } 
     }); 

     View.OnClickListener exit = new View.OnClickListener(){ 
      @Override 
      public void onClick(View view) { 
       finish(); 
      } 
     }; 

     exitButton.setOnClickListener(exit); 
    } 

    private void getDestination(Spinner addressFieldSpinner) { 
     friendlyLocation = addressFieldSpinner.getSelectedItem().toString(); 

     if (friendlyLocation.equals("Home")) { 
      address = getString(R.string.homeAddress); 
     } else if (friendlyLocation.equals("Sarahs house")) { 
      address = getString(R.string.SarahsAddress); 
     } else if (friendlyLocation.equals("Work")) { 
      address = getString(R.string.workAddress); 
     } else if (friendlyLocation.equals("Custom")) { 
      address = "Custom"; 
     } else { 
      //do nothing 
     } 
    } 

    private String GetTransportType(RadioButton googTransitButton, RadioButton googBikeButton, RadioButton googDrivingButton, RadioButton 
      googWalkingButton) { 

     if (googBikeButton.isChecked()){ 
      mode = "&mode=b"; //user chose biking 
     } 
     else if (googDrivingButton.isChecked()){ 
      mode = "&mode=d"; //user choose driving 
     } 
     else if (googTransitButton.isChecked()) { 
      mode = "&mode=transit"; //user chose public transit 
     } 
     else if (googWalkingButton.isChecked()){ 
      mode = "&mode=w"; //user chose walking 
     } 
     return mode; 
    } 

    private void getGoogleDirections(String mode) { 
     boolean connected = isConnected(); 

     if (!connected){ 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setTitle("Mappy is sorry...") 
        .setIcon(R.mipmap.ic_launcher) 
        .setMessage("You do not have a mobile or wifi connection with internet service at this time.") 
        .setCancelable(false) 
        .setNegativeButton("OK",new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 
        }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     } 

     else if (address == null || address == "") { 
      Toast.makeText(MainActivity.this, "It looks like you select custom address, but did not enter an address.", Toast.LENGTH_LONG).show(); 
     } 

     else { 
      try { 
       address = address.replace(' ', '+'); 
       Uri mapsIntentUri = Uri.parse("google.navigation:q=" + address + mode); 
       Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapsIntentUri); 
       mapIntent.setPackage("com.google.android.apps.maps"); 
       startActivity(mapIntent); 
      } 
      catch (Exception exception) { 
      } 
     } 
    } 

    public class SpinnerActivity extends Activity implements AdapterView.OnItemSelectedListener { 

     public void onItemSelected(AdapterView<?> parent, View view,int pos, long id) { 

      friendlyLocation = parent.getItemAtPosition(pos).toString(); 

      /* if (friendlyLocation.equals("Home")) { 
       address = "2617 SE 35th Place"; 
      } else if (friendlyLocation.equals("Sarahs house")) { 
       address = "3946 NE Failing, Portland, OR 97212"; 
      } else if (friendlyLocation.equals("Work")) { 
       address = "619 SW 11th Avenue, Portland, OR 97205"; 
      } else if (friendlyLocation.equals("Custom")) { 
       address = getCustomAddress(); 
      } else { 
      }*/ 
     } 

     public void onNothingSelected(AdapterView<?> parent) { 
      // Another interface callback 

     } 
    } 

    private String getCustomAddress() { 
     final EditText addressEditText = new EditText(this); 
     final String[] customAddress = {""}; 

     AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); 
     alertDialog.setTitle("Please enter destination address"); 
     alertDialog.setView(addressEditText); 
     alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int whichButton){ 
       customAddress[0] = addressEditText.getText().toString(); 
      } 
     }); 
     alertDialog.setNegativeButton("CANCEL", null); 
     alertDialog.create().show(); 

     return customAddress[0]; 
    } 

    //Checks for mobile or wifi connectivity, returns true for connected, false otherwise 
    private boolean isConnected() { 
     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     return connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || 
       connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED; 
    } 

} 

回答

1

是。它無序,因爲無論AlertDialog仍在顯示,方法getCustomAddress都已完成。當您看到對話框時,表示alertDialog.create().show();已完成,然後從getCustomAddress返回以執行下一行GetTransportType。一個簡單的解決方法是:

private String getCustomAddress() { 
    final EditText addressEditText = new EditText(this); 
    final String[] customAddress = {""}; 

    AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); 
    alertDialog.setTitle("Please enter destination address"); 
    alertDialog.setView(addressEditText); 
    alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int whichButton){ 
      customAddress[0] = addressEditText.getText().toString(); 
      //add call to ggtransporttype here******** 
      doNext();//or you can use a handler here!! 
    }); 
    alertDialog.setNegativeButton("CANCEL", null); 
    alertDialog.create().show(); 

    return customAddress[0]; 
} 


private void doNext(){ 
     //3. Find out what transportation method user wants 
     GetTransportType(googTransitButton, googBikeButton, googDrivingButton, googWalkingButton); 

     //4. Get directions from Google Maps 
     getGoogleDirections(mode); 

    } 
+0

我理解你的問題的解釋現在用getCustomAddress方法。我正在測試您推薦的解決方法。 – joshgoldeneagle

+0

解決方案通常在doNext方法中再次聲明單選按鈕後工作。 只是想知道你的意思是使用處理程序作爲選項?你認爲我應該叫DoNext方法更具描述性嗎? – joshgoldeneagle

0

的一種方式,你可以通過調用任何方法之前最初創建對話框解決這個問題,然後表示只要你想。 首先聲明一個成員在MainActivity

private AlertDialog.Builder alertDialog; 

,然後在MainActivity's onCreate()您可以創建(未顯示)的對話:

final String[] customAddress = {""}; 
final EditText addressEditText = new EditText(this); 
alertDialog = new AlertDialog.Builder(this); 
     alertDialog.setTitle("Please enter destination address"); 
     alertDialog.setView(addressEditText); 
     alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int whichButton){ 
       customAddress[0] = addressEditText.getText().toString(); 
      } 
     }); 
     alertDialog.setNegativeButton("CANCEL", null); 
     alertDialog.create(); 

你甚至可以提取代碼在不同的創建對話框代碼模塊化的方法。 現在,您可以顯示該對話框中被調用其他方法之前:

launchMapButton.setOnClickListener(new Button.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       //1. Find out where user wants to go 
       getDestination(addressFieldSpinner); 

       //2. Check for custom address 
       if (address.equals("Custom")){ 
        alertDialog.show(); 
       } 

        //3. Find out what transportation method user wants 
        GetTransportType(googTransitButton, googBikeButton, googDrivingButton, googWalkingButton); 

        //4. Get directions from Google Maps 
        getGoogleDirections(mode); 

      } 
     });