2017-05-05 16 views
0

最近、私はFragmentsでの作業を開始しました。問題はそれに関係していると思われます。私は基本的に(RelativeLayout型の)行のリストを含むDialogFragmentを持っています。各行には、カスタムビュー(キャンバスを含む)とボタンがあります。 OnClickListenerをアタッチしようとしていますが、トリガーされていないことがわかります。私は間違って何をしていますか?onClickイベントがトリガーされていません

EDIT 2011年5月8日 私はOnClickイベントの火を得ることができました。私の問題は、今すぐイベントが発射されないということです。いくつかのボタンをクリックすると、AlertGialog内の他の場所をクリックした場合にのみ、イベントが一斉に発生します。

MainActivity.java

public class MainActivity extends AppCompatActivity implements ColorChoiceRow.OnColorButtonClicked { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     FragmentManager fm = getSupportFragmentManager(); 
     ColorDialogFragment colorDialogFragment = ColorDialogFragment.newInstance("Select a Color"); 
     colorDialogFragment.show(fm, "fragment_edit_name"); 
    } 

    @Override 
    public void OnColorButtonClicked(String name) { 
     Log.d("ColorDebug", "Hey, you selected " + name + "!"); 
    } 
} 

ColorDialogFragment.java

public class ColorDialogFragment extends DialogFragment { 
    private final String TAG = this.getClass().getSimpleName(); 
    private List<ColorChoiceRow> listColorChoiceRows; 

    public ColorDialogFragment() { 
    } 

    public static ColorDialogFragment newInstance(String title) { 
     ColorDialogFragment frag = new ColorDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putString("title", title); 
     frag.setArguments(args); 
     return frag; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_color_ramp_dialog, container); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     listColorChoiceRows = new ArrayList<ColorChoiceRow>(); 
     listColorChoiceRows.add(new ColorChoiceRow(getContext(), Color.BLUE, "Blue")); 
     listColorChoiceRows.add(new ColorChoiceRow(getContext(), Color.CYAN, "Cyan")); 
     listColorChoiceRows.add(new ColorChoiceRow(getContext(), Color.BLACK, "Black")); 
     listColorChoiceRows.add(new ColorChoiceRow(getContext(), Color.YELLOW, "Yellow")); 
     String title = getArguments().getString("title"); 
     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity()); 
     alertDialogBuilder.setTitle(title); 

     alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       if (dialog != null) { 
        dialog.dismiss(); 
       } 
      } 
     }); 
     alertDialogBuilder.setAdapter(new RowAdapter(getContext(), listColorChoiceRows), 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }); 
     return alertDialogBuilder.create(); 
    } 
} 

ColorChoiceRow.java

public class ColorChoiceRow extends RelativeLayout { 

    private ColorView colorView; 
    private int color; 
    private OnColorButtonClicked mListener; 

    public ColorChoiceRow(final Context context, int color, final String text) { 
     super(context); 
     this.color = color; 

     if (context instanceof OnColorButtonClicked) { 
      mListener = (OnColorButtonClicked) context; 
     } else { 
      throw new ClassCastException(context.toString() + " must implement OnRageComicSelected."); 
     } 

     this.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
     //this.setPadding(10, 10, 10, 0); 

     colorView = new ColorView(context, color); 
     colorView.setId(1); 

     Button invertButton = new Button(context); 
     invertButton.setId(3); 
     invertButton.setClickable(true); 
     invertButton.setText("Color Button"); 
     invertButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mListener.OnColorButtonClicked(text); 

      } 
     }); 


     LayoutParams paramsColorRamp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     paramsColorRamp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     //paramsAlignLeft.addRule(RelativeLayout.); 
     //colorView.setLayoutParams(paramsColorRamp); 

     LayoutParams paramsInvertButton = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     paramsInvertButton.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     invertButton.setLayoutParams(paramsInvertButton); 

     this.addView(colorView, paramsColorRamp); 
     this.addView(invertButton, paramsInvertButton); 
    } 

    public interface OnColorButtonClicked { 
     void OnColorButtonClicked(String name); 
    } 
} 

ColorView.java

public class ColorView extends View { 
    private int color; 
    public ColorView(Context context, int color) { 
     super(context); 
     this.color = color; 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     Paint paint = new Paint(); 
     paint.setColor(color); 
     canvas.drawRect(0,0, 300, 100, paint); 
    } 

    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     setMeasuredDimension(300, 100); 
    } 
} 

RowAdapter.java

public class RowAdapter extends BaseAdapter 
{ 
    private List<ColorChoiceRow> colorChoiceRowList; 
    private Context context; 

    public RowAdapter(Context c, List<ColorChoiceRow> colorChoiceRows) { 
     this.colorChoiceRowList = colorChoiceRows; 
     this.context = c; 
    } 

    @Override 
    public int getCount() { 
     return colorChoiceRowList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return colorChoiceRowList.get(position); 
    } 

    @Override 
    public long getItemId(int id) { 
     return id; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     return colorChoiceRowList.get(position); 
    } 
} 
+0

'ColorChoiceRow'にも' setClickable(true) 'を適用してください。 – azizbekian

+0

それはうまくいかなかった – Naci

答えて

0

溶液は、アダプタ(RowAdaptor)を除去し、代わりのLinearLayoutを用いました。

setAdapterメソッドの代わりに、setViewメソッドを使用して私の問題を解決しました。

関連する問題