2013-12-17 19 views
8

Vì vậy, tôi có danh sách lựa chọn Khu vực hiển thị DialogFragment. Khi người dùng nhấp vào khu vực, danh sách sẽ lấy lại dữ liệu để hiển thị danh sách lựa chọn Đường phố. Tại thời điểm này, tôi muốn cho phép người dùng nhấn nút quay lại phần cứng để quay lại lựa chọn Khu vực. Điều này có thể không? Tôi đã cố gắng ghi đè lên một vài phương pháp bên dưới nhưng tôi chỉ có thể nhấn vào sự kiện nhưng không thể dừng sự kiện đó.Cách tốt nhất để xử lý hành vi quay lại trên DialogFragment là gì?

@Override 
public void onCancel(DialogInterface dialog) { 
    if(isDismissable()){ 
     super.onCancel(dialog); 
    }else { 
     Log.d(TAG, "Don't dismiss cancel this dialog!"); 
    } 
} 

@Override 
public void dismissAllowingStateLoss() { 
    if(isDismissable()){ 
     super.dismissAllowingStateLoss(); 
    }else { 
     Log.d(TAG, "Don't dismiss this dialog!"); 
    } 
} 

@Override 
public void dismiss() { 
    if(isDismissable()){ 
     super.dismiss(); 
    }else { 
     Log.d(TAG, "Don't dismiss this dialog!"); 
    } 
} 

dismiss() được gọi khi người dùng bấm lại nút nhưng ngay cả nếu tôi không gọi super.dismiss(), thoại bị sa thải bất kể.

Có cách nào để thực hiện việc này không? Tôi cũng xem cách ứng dụng Google+ hiển thị ActionBar trong Hộp thoại để cung cấp HomeAsUp nhưng tôi không thể tìm thấy bất kỳ thông tin nào về nó.

Trả lời

5

tôi thấy hai giải pháp:

Cách đơn giản nhất: lựa chọn có diện tích và danh sách lựa chọn đường như cả hai mảnh thông thường riêng biệt và có cả trong số họ trong một hoạt động riêng biệt và có hoạt động này như một hộp thoại thông qua một chủ đề đơn giản: <activity android:theme="@android:style/Theme.Dialog" /> và có excludeFromRecents="true" để không có điều này trong các ứng dụng đã sử dụng gần đây. Lựa chọn khu vực được tải trước, sau đó thêm lựa chọn đường phố qua addToBackStack(null) do đó bạn sẽ có đoạn AreaSelection bên dưới.

Nếu bạn không muốn có hoạt động riêng vì lý do này, bạn có thể thêm trình nghe thoại từ hộp thoại và trình cài đặt (hoạt động) sẽ mở AreaFragment.Với một sự hiểu biết cơ bản về mã của bạn dự án đơn giản này nên làm điều đó:

Các hoạt động chủ sở hữu:

import com.example.adip.fragments.AreaSelectionFragment; 
import com.example.adip.fragments.StreetSelectionFragment; 
import com.example.adip.fragments.AreaSelectionFragment.AreaSelectionListener; 
import com.example.adip.fragments.StreetSelectionFragment.StreetSelectionListener; 

import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.support.v4.app.FragmentActivity; 
import android.view.View; 
import android.view.View.OnClickListener; 

public class DialogsActivity extends FragmentActivity implements OnClickListener, 
     AreaSelectionListener, StreetSelectionListener { 

    private static final String AREA_TAG = "AREA_TAG"; 

    private static final String STREETS_TAG = "STREETS_TAG"; 

    @Override 
    protected void onCreate(Bundle savedInstance) { 
     super.onCreate(savedInstance); 
     setContentView(R.layout.area_selections); 
     findViewById(R.id.btnStuff).setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     showArea(); 
    } 

    private void showArea() { 
     DialogFragment df = new AreaSelectionFragment(); 
     df.show(getSupportFragmentManager(), AREA_TAG); 
    } 

    @Override 
    public void onStreetsUserCanceled() { 
     showArea(); 
    } 

    @Override 
    public void showStreets() { 
     DialogFragment df = new StreetSelectionFragment(); 
     df.show(getSupportFragmentManager(), STREETS_TAG); 
    } 

} 

AreaSelectionFragment (mở rộng nó yêu cầu của bạn):

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 

public class AreaSelectionFragment extends DialogFragment { 
    public static interface AreaSelectionListener { 
     void showStreets(); 
    } 

    private AreaSelectionListener areaSelectionListener; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     if (activity instanceof AreaSelectionListener) { 
      areaSelectionListener = (AreaSelectionListener) activity; 
     } else { 
      throw new ClassCastException("Parent Activity must implement AreaSelectionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     areaSelectionListener = null; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new AlertDialog.Builder(getActivity()).setTitle("Area Selection") 
       .setPositiveButton("OK", new OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         areaSelectionListener.showStreets(); 
        } 
       }).setNegativeButton("Cancel", null).create(); 
    } 
} 

StreetSelectionFragment (một lần nữa: mở rộng nó theo nhu cầu của bạn):

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 

public class StreetSelectionFragment extends DialogFragment { 
    public static interface StreetSelectionListener { 
     void onStreetsUserCanceled(); 
    } 

    private StreetSelectionListener selectionListener; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     if (activity instanceof StreetSelectionListener) { 
      selectionListener = (StreetSelectionListener) activity; 
     } else { 
      throw new ClassCastException("Parent activity must implement StreetSelectionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     selectionListener = null; 
     super.onDetach(); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Dialog dialog = new AlertDialog.Builder(getActivity()).setTitle("Street Selection") 
       .setPositiveButton("OK", null).setNegativeButton("Cancel", new OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         selectionListener.onStreetsUserCanceled(); 
        } 
       }).create(); 
     return dialog; 
    } 

    @Override 
    public void onCancel(DialogInterface dialog) { 
     super.onCancel(dialog); 
     selectionListener.onStreetsUserCanceled(); 
    } 
} 
+0

Cả hai giải pháp đều không đẹp ... 1. Không hoạt động nếu bạn đang làm việc trong các đoạn lồng nhau, 2. Sẽ khởi chạy hộp thoại mới để bạn không thể thực hiện bất kỳ chuyển đổi/hoạt ảnh nào đẹp khi nội dung thay đổi. – Ixx

3

Cách tốt nhất để xử lý lại hành vi trên DialogFragment?

Cách tốt nhất để xử lý hành vi ngược lại trên DialogFragment sẽ không gây rối với nó và để nguyên như vậy, suy nghĩ lại trong quá trình tiếp cận hiện tại của bạn. Nếu tôi nhìn thấy một hộp thoại trong ứng dụng và tôi đang quay lại, tôi mong đợi để bật hộp thoại ra khỏi màn hình và không điều hướng giữa các trang của hộp thoại (Tôi hy vọng tôi đã không đọc câu hỏi của bạn) .

Có cách nào để thực hiện việc này không?

Trong bạn DialogFragment bạn có thể sử dụng một tùy chỉnh Dialog (tôi giả sử bạn chỉ cần sử dụng onCreateDialog() gọi lại để trả lại Dialog với danh sách) mà bạn ghi đè lên onKeyDown() callback để xử lý lại bị ép:

public class CustomDialog extends Dialog { 

    protected CustomDialog(Context context) { 
     super(context); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
      // the back key was pressed so do something? 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

} 

tôi cũng nhìn vào cách Google+ ứng dụng được hiển thị ActionBar trong DialogFragment để cung cấp HomeAsUp nhưng tôi không thể tìm thấy bất kỳ thông tin về nó.

Bạn luôn có thể tạo Activity trông giống như Dialog.

+0

Cảm ơn. Tôi sử dụng DialogFragment như tôi có thể sử dụng nó như là một Fragment trong phiên bản máy tính bảng. Tôi đang làm việc trên một ActionBar giả mạo trên đầu trang của DialogFragment cho bây giờ. – RobGThai

1
The best way is to override onBackPressed() in the dialog , you created in onCreateDialog(). 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    return new Dialog(getActivity(), getTheme()){ 
     @Override 
     public void onBackPressed() { 
      //do your stuff 
     } 
    }; 
} 
Các vấn đề liên quan