2016-03-03 29 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); 

      } 
     });