10

AlertDialogUIをブロックするため、が表示されたときにユーザーがアクションを実行するのを待つ方法がないというさまざまな投稿を読みました。

ただし、Facebookたとえば、GPSを表示するようなアプリは現在無効になっています。GPSを有効にしますか?警告ダイアログを表示し、ユーザーがyes/noを押すのを待ちます。2つの異なるアクティビティを使用できると思います。最初のアクティビティにはgpsアラートダイアログのみが含まれていますが、これは正しくないようで、Facebookのようには見えません。

誰かが私にこれを達成する方法を教えてもらえますか?

これは私のコードです:

       @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    InitializeComponents();

    EnableGPSIfPossible();


        ListAsync lAsync = new ListAsync(this);
        lAsync .execute();
    }


    private void EnableGPSIfPossible()
{   
    final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );
     if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
            buildAlertMessageNoGps();
        }
}

 private  void buildAlertMessageNoGps() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Yout GPS seems to be disabled, do you want to enable it?")
               .setCancelable(false)
               .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                   public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                     startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                   }
               })
               .setNegativeButton("No", new DialogInterface.OnClickListener() {
                   public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                        dialog.cancel();
                   }
               });
        final AlertDialog alert = builder.create();
        alert.show();
    }

したがって、私のコードではAsynTask、ユーザーがgpsをアクティブ化するのを待たずに、すぐに起動します。(これは通常の動作です)

ありがとうございました!

4

5 に答える 5

13

あなたが実際にできることはこれです:

GPSManager.java:

public class GPSManager {

    private Activity activity;
    private LocationManager mlocManager;
    private LocationListener gpsListener;

    public GPSManager(Activity activity) {
        this.activity = activity;
    }

    public void start() {
        mlocManager = (LocationManager) activity
                .getSystemService(Context.LOCATION_SERVICE);

        if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            setUp();
            findLoc();
        } else {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                    activity);
            alertDialogBuilder
                    .setMessage("GPS is disabled in your device. Enable it?")
                    .setCancelable(false)
                    .setPositiveButton("Enable GPS",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    Intent callGPSSettingIntent = new Intent(
                                            android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                    activity.startActivity(callGPSSettingIntent);
                                }
                            });
            alertDialogBuilder.setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });
            AlertDialog alert = alertDialogBuilder.create();
            alert.show();

        }
    }

    public void setUp() {
        gpsListener = new GPSListener(activity, mlocManager);
    }

    public void findLoc() {
        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1,
                gpsListener);

        if (mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER) == null)
            Toast.makeText(activity, "LAST Location null", Toast.LENGTH_SHORT)
                    .show();
        else {
            gpsListener.onLocationChanged(mlocManager
                    .getLastKnownLocation(LocationManager.GPS_PROVIDER));
        }
    }
}

GPSListener.java:

public class GPSListener implements LocationListener {

    private Activity activity;
    private LocationManager lm;
    private int numberOfUpdates;

    public static final int MAX_NUMBER_OF_UPDATES = 10;

    public GPSListener(Activity activity, LocationManager lm) {
        this.activity = activity;
        this.lm = lm;
    }

    @Override
    public void onLocationChanged(Location loc) {
        if (numberOfUpdates < MAX_NUMBER_OF_UPDATES) {
            numberOfUpdates++;

            Log.w("LAT", String.valueOf(loc.getLatitude()));
            Log.w("LONG", String.valueOf(loc.getLongitude()));
            Log.w("ACCURACY", String.valueOf(loc.getAccuracy() + " m"));
            Log.w("PROVIDER", String.valueOf(loc.getProvider()));
            Log.w("SPEED", String.valueOf(loc.getSpeed() + " m/s"));
            Log.w("ALTITUDE", String.valueOf(loc.getAltitude()));
            Log.w("BEARING", String.valueOf(loc.getBearing() + " degrees east of true north"));

            String message;

            if (loc != null) {
                message = "Current location is:  Latitude = "
                        + loc.getLatitude() + ", Longitude = "
                        + loc.getLongitude();
                // lm.removeUpdates(this);
            } else
                message = "Location null";

            Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
        } else {
            lm.removeUpdates(this);
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        Toast.makeText(activity, "Gps Disabled", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onProviderEnabled(String provider) {
        Toast.makeText(activity, "Gps Enabled", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

}

そしてあなたの活動から:

GPSManager gps = new GPSManager(
                                    yourActivity.this);
                            gps.start();
于 2012-08-20T20:25:38.783 に答える
7

シンプルな機能を使用してそれを行いましたが、アラートボックスを表示せずに、ユーザーコントロールを設定ページにリダイレクトしました

これが私が使った関数です

public void isGPSEnable(){
        LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean enabled = service
          .isProviderEnabled(LocationManager.GPS_PROVIDER);
        if (!enabled) {
          Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
          startActivity(intent);
        } 

}
于 2012-09-14T11:24:23.360 に答える
5

私はこれをうまく機能させることができました。stackoverlfowで見つけたこの記事に触発されました。http://developmentality.wordpress.com/2009/10/31/android-dialog-box-tutorial/

基本的に、アラートダイアログの[はい]ボタンと[キャンセル]ボタンで実行する必要のあるロジックを移動しました。[はい]ボタンと[キャンセル]ボタンに必要なロジックを実行した後、非同期ロジックの実行を開始します。

これが私のコードです:

public interface ICommand
{
    void execute();
}

アラートダイアログの[GPSを有効にする]ボタンと[キャンセル]ボタンに使用される2つの具体的なコマンド:

public class CancelCommand implements ICommand
{
    protected Activity m_activity;

    public CancelCommand(Activity activity)
    {
        m_activity = activity;
    }

    public void execute()
    {
        dialog.dismiss();
        //start asyncronous operation here
    }
}


public class EnableGpsCommand extends CancelCommand
{
    public EnableGpsCommand( Activity activity) {
        super(activity);
    }

    public void execute()
    {
        // take the user to the phone gps settings and then start the asyncronous logic.
        m_activity.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
        super.execute();
    }
}

そして今、アクティビティから:

//returns true if the GpsProviderIsDisabled
//false otherwise
private boolean EnableGPSIfPossible()
{   
    final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );
    if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
        buildAlertMessageNoGps();
        return true;
    }
    return false;
}


private  void buildAlertMessageNoGps()
{
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Yout GPS seems to be disabled, do you want to enable it?")
        .setCancelable(false)
        .setPositiveButton("Yes", new CommandWrapper(new EnableGpsCommand(this)))
        .setNegativeButton("No", new CommandWrapper(new CancelCommand(this))); 

    final AlertDialog alert = builder.create();
    alert.show();
}

ここで、ActivityOnCreateメソッドから次を呼び出します。

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.newfriendlist);

    InitializeComponents();

    if (!EnableGPSIfPossible())
    {
        //then gps is already enabled and we need to do StartFriendRetrievalAsync from here.
        //otherwise this code is being executed from the EnableGpsIfPossible() logic.


        //Asyncronous logic here.
    }
}

この時点で行き詰まったときに、これがお役に立てば幸いです:)。

乾杯

于 2012-09-16T11:07:24.113 に答える
3
   final AlertDialog.Builder builder = new AlertDialog.Builder(this);
         final String action = Settings.ACTION_LOCATION_SOURCE_SETTINGS;
         final String message = "your message";

         builder.setMessage(message)
             .setPositiveButton("OK",
                 new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface d, int id) {
                         getActivity().startActivity(new Intent(action));
                         d.dismiss();
                     }
             })
             .setNegativeButton("Cancel",
                 new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface d, int id) {
                         d.cancel();
                     }
             });
         builder.create().show();
于 2015-06-12T13:01:29.097 に答える
1

(私の英語で申し訳ありません)私はあなたの質問を見て、あなたの質問が答えを与えるとき、私は解決策を探していました。

問題は、ダイアログアラートが開いている間、アクティビティが起動を継続し、ユーザーが「はい」を押すと、ユーザーがGPSをオンに設定した後、最初のアクティビティに戻ったときに、新しいアクティビティが「GPSの設定」を開始することです。あなたを無視しました。この同じアクティビティは更新を行わないか、すでにロードされているために何か(gps onなど)が発生したと見なします。そのため、更新を聞いて変更を適用するか、ユーザーが「戻った」ときにアクティビティを再開する必要があります。 、私のために私はちょうど追加しました:

<activity
    ...
    android:noHistory="true"
    ... /> </activity>

これで、ユーザーが[戻る]ボタンを押すたびに、新しい更新が機能したことを考慮してアクティビティが再開されます。これがあなたや他の人の助けになることを願っています。

于 2017-04-20T15:58:14.663 に答える