2013-06-24 32 views
10

Có thể sử dụng DialogFragment khi sử dụng Activity thay vì FragmentActivity không? Các phương thức show() cần có số FragmentManager.DialogFragment mà không cần FragmentActivity

Tôi muốn triển khai Hộp thoại chỉ chứa một EditText và hướng dẫn trên nhà phát triển Android cho biết tôi phải sử dụng bố cục tùy chỉnh trên đoạn hộp thoại. Vì vậy, tôi hỏi nguyên nhân tôi không muốn thay đổi để sử dụng FragmentActivity chỉ dành cho 1 hộp thoại.

SOLVED: Tôi quyết định chỉ sử dụng FragmentActivity thay vì Activity để nó không trở nên phức tạp hơn.

+0

Vui lòng chỉnh sửa câu hỏi của bạn vì câu hỏi chưa đủ rõ ràng.Bạn có đang cố gắng triển khai DialogFragment bằng cách mở rộng lớp Hoạt động không? – Marek

+0

Không, tôi đã cố gắng sử dụng DialogFragment trên một lớp tùy chỉnh mở rộng Hoạt động. Các hướng dẫn nói rằng lớp tùy chỉnh nên mở rộng FragmentActivity thay vì Activity. Vì vậy, tôi đã hỏi liệu tôi có thể làm điều đó mở rộng Hoạt động hay không. –

+0

Bạn đã cố gắng làm điều đó? Gặp phải bất kỳ vấn đề gì? – Marek

Trả lời

0

Nếu bạn cần hộp thoại bao quát cho tất cả các đoạn của mình, chỉ cần sử dụng thông thường dialog code cho các hoạt động có hoạt động phân đoạn. Nếu không, chỉ cần thực hiện nó trong một DialogFragment như một đứa trẻ của hoạt động Fragment.

17

Tôi gặp phải vấn đề tương tự. Tôi biết bạn đã hỏi điều này một năm trước, nhưng vẫn còn để giúp người dùng khác. Đây là cách tôi giải quyết vấn đề.

public void show_dialog() { 
    FragmentManager fm = getFragmentManager(); 
    DialogFragment newFragment = new DialogFragment(); 
    newFragment.show(fm, "abc"); 
} 

Điều này chỉ yêu cầu nhập FragmentManager chứ không phải FragmentActivity.

+5

Nếu bạn đang sử dụng thư viện hỗ trợ V7, bạn cần phải gọi "getSupportFragmentManager()" để thay thế. Cảm ơn nhiều! –

+0

Lưu ý! Nó yêu cầu mức API tối thiểu 11 –

0

Tôi đã gặp sự cố tương tự nhưng đã cố gắng khắc phục sự cố với sự trợ giúp của các câu trả lời trong bài đăng tràn ngăn xếp được liên kết bên dưới. Tôi đặc biệt thích giải pháp của mrolcsi với khái niệm người nghe tích cực/tiêu cực, cho kết quả rất gọn gàng theo tôi.

Get value from DialogFragment

2

Có lẽ một chút muộn nhưng tôi cũng đã có vấn đề để gọi một DialogFragment từ một tổ chức phi FragmentActivity. Ngoài ra làm cho nó một FragmentActivity chỉ cho một hộp thoại đơn giản sẽ không có ý nghĩa. Vì vậy, giải pháp cho tôi là tạo một giao diện với khoảng trống gọi lại để nhận phản hồi DialogFragment trong hoạt động. Đối với tôi, chúng ta sẽ nhận được phản hồi gần cuộc gọi thoại thay vì nhận nó ở đâu đó trong ghi đè onActivityResult.

Giao diện:

import android.os.Parcelable; 

/** 
* Created by TH on 03.11.2015. 
*/ 
public interface OnDialogResponseListener extends Parcelable { 

    void onDialogResponse(int responseCode); 

} 

Lớp thoại chung:

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

/** 
* Code basisc found here: 
    * http://stackoverflow.com/questions/7977392/android-dialogfragment-vs-dialog 
* changed by TH on 03.11.2015. 
    */ 
public class YesNoDialog extends DialogFragment 
{ 

    public static final String TITLE="title"; 
    public static final String MESSAGE="message"; 
    public static final String LISTENER="listener"; 
    public static final String YES="yes"; 
    public static final String NO="no"; 
    public static final String ICON_ID="icon_id"; 
    private OnDialogResponseListener mResponseListener; 

    public YesNoDialog() 
    { 

    } 


    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     Bundle args = getArguments(); 
     String title = args.getString(TITLE, ""); 
     String message = args.getString(MESSAGE, ""); 
     String yes = args.getString(YES, ""); 
     String no = args.getString(NO, ""); 
     int iconID=args.getInt(ICON_ID); 
     mResponseListener=args.getParcelable(LISTENER); 

     return new AlertDialog.Builder(getActivity()) 
       .setTitle(title) 
       .setMessage(message) 
       .setIcon(iconID) 
       .setPositiveButton(yes, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         if (mResponseListener != null) { 
          mResponseListener.onDialogResponse(Activity.RESULT_OK); 
         } 

        } 
       }) 
       .setNegativeButton(no, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         if (mResponseListener != null) { 
          mResponseListener.onDialogResponse(Activity.RESULT_CANCELED); 
         } 
        } 
       }) 
       .create(); 
    } 
} 

Và việc sử dụng sẽ là như thế này:

OnDialogResponseListener onDialogResponseListener=new OnDialogResponseListener() { 


       @Override 
       public int describeContents() { 
        return 0; //Leave this as it is 
       } 

       @Override 
       public void writeToParcel(Parcel dest, int flags) { 
         //Leave this as it is 
       } 

       @Override 
       public void onDialogResponse(int responseCode) { 


        //Do what you want with your dialog answers 

        if(responseCode== Activity.RESULT_OK){ 
         Toast.makeText(MovementActivity.this,"OK pressed",Toast.LENGTH_LONG).show(); 
        }else if(responseCode==Activity.RESULT_CANCELED){ 
         Toast.makeText(MovementActivity.this,"CANCEL pressed",Toast.LENGTH_LONG).show(); 
        } 

       } 
      }; 


      YesNoDialog dialog = new YesNoDialog(); 
      Bundle args = new Bundle(); 
      args.putInt(YesNoDialog.ICON_ID, R.drawable.ic_action_add_light); 
      args.putString(YesNoDialog.YES, getString(R.string.action_add)); 
      args.putString(YesNoDialog.NO, getString(R.string.action_cancel)); 
      args.putString(YesNoDialog.TITLE, getString(R.string.dialog_title_add_item)); 
      args.putString(YesNoDialog.MESSAGE, getString(R.string.dialog_message_add_item)); 
      args.putParcelable(YesNoDialog.LISTENER, onDialogResponseListener); 
      dialog.setArguments(args); 
      dialog.show(getSupportFragmentManager(), "tag"); 

Đó là tất cả. Có lẽ một chút mã hơn trong một hộp thoại simle nhưng nó giữ giá trị và hiển thị của nó về sự thay đổi định hướng. Đó là mục tiêu của tôi khi sử dụng DialogFragment.

+0

Cảm ơn bạn rất nhiều, giải pháp tốt đẹp và làm việc! –