2014-04-30 18 views
1

我創建了一個從DialogFragment延伸的類。我使用自定義佈局,並在該對話框中添加了一些按鈕。如何在DialogFragment中訪問或創建對小部件的引用

我給按鈕定義了字段,但是當我從主活動啓動對話框時,我得到了nullreferenceexception。

下面是對話框類:

公共類PickRewardDialog擴展DialogFragment {

private Button mButtonAddCoin; 

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

    mButtonAddCoin = (Button) getDialog().findViewById(R.id.button_dialog_reward_get_coin); 
    mButtonAddCoin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(getDialog().getContext().getApplicationContext(), "You will" + 
        " receive 5 coins!", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    if(getDialog() != null){ 
     getDialog().setCanceledOnTouchOutside(false); 
    } 
    return super.onCreateView(inflater, container, savedInstanceState); 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    Resources res = getActivity().getResources(); 
    Bundle bundle = getArguments(); 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    builder.setView(inflater.inflate(R.layout.dialog_pick_reward, null)) 
    //Positive button 
    .setPositiveButton(R.string.dialog_choose_reward_positive_button, 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        //do nothing or Dismiss() 
       } 
      } 
    ); 

    return builder.create(); 
} 

}

和佈局:

<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="#FFFFBB33" 
    android:contentDescription="@string/app_name" 
    android:scaleType="center" 
    android:src="@drawable/dialog_title_pick_your_reward"/> 

<Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Add 5 coins to your account!" 
    android:id="@+id/button_dialog_reward_get_coin" 
    android:layout_gravity="center_horizontal"/> 

<Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Get a temorary boost on leaderboard!" 
    android:id="@+id/button_doalog_reward_boost"/> 

所以問題是我怎樣才能設置clicklistener並做它的東西?

回答

2

此對話框在FragmentonCreate()回調中不可用,因此mButtonAddCoin引用將爲空。相反,在onCreateDialog()回調中設置Button,您實際上會誇大對話框的視圖:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Resources res = getActivity().getResources(); 
    Bundle bundle = getArguments(); 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View dialogView = inflater.inflate(R.layout.dialog_pick_reward, null); 
    mButtonAddCoin = (Button) dialogView.findViewById(R.id.button_dialog_reward_get_coin); 
    mButtonAddCoin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(getDialog().getContext().getApplicationContext(), "You will" + 
        " receive 5 coins!", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    builder.setView(dialogView); 
    //Positive button 
    .setPositiveButton(R.string.dialog_choose_reward_positive_button, 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        //do nothing or Dismiss() 
       } 
      } 
    ); 

    return builder.create(); 
} 
相關問題