引言
我在android上练习画布图形。为此我创建了一个应用程序,我可以用手指写一行,然后擦除它。
单击调色板时,会出现一个带有某些颜色的对话框窗口。所以我有2个布局:
1-主要布局
2-调色板布局
问题
首先,我在主要活动中获得了调色板,对于每个颜色按钮,我有一个onClick调用主Activity上的方法。
问题是现在我无法在onClick功能上执行此操作。我认为这与它有关,现在我将此布局作为视图而不是布局开始,因此每个按钮的onClick功能不起作用
这是palette.xml布局的按钮示例:
<ImageButton
android:layout_width="@dimen/large_brush"
android:layout_height="@dimen/large_brush"
android:background="#FF660000"
android:onClick="paintClicked"
android:tag="#FF660000" />
当我点击每个按钮时,它会启动paintClicked方法并传递颜色标记。
那么,当我点击调色板按钮时,如何启动调色板布局,以便能够将信息从此布局传递到主要活动?
UPDATE - 调用palette.xml的当前方法
final Dialog paletteDialog = new Dialog(this);
paletteDialog.setTitle("Colores:");
paletteDialog.setContentView(R.layout.palette);
LinearLayout paletteLayout = (LinearLayout) paletteDialog.findViewById(R.id.paint_colors);
bnColor = (ImageButton) paletteLayout.getChildAt(0);
bnColor.setImageDrawable(getResources().getDrawable(R.drawable.button_pressed));
paletteDialog.show();
Logcat:
java.lang.NoSuchMethodException: paintClicked [class android.view.View]
这是paintClicked方法参考:
public void paintClicked(View view){
答案 0 :(得分:1)
我建议您查看DialogFragment
(如果您尚未使用它)。您可以创建一个简单的回调接口,以便在单击颜色时,它会使用此信息回调到封闭的Activity
。使封闭的Activity
实现接口(由下面的onAttach
生命周期方法强制执行),并在选择颜色时让对话框片段调用它。
public class ColorPickerDialog extends DialogFragment implements View.OnClickListener {
// Define a callback interface
public interface OnColorSelectedListener {
public void onColorSelected(int color);
}
private OnColorSelectedListener listener;
@Override
public void onAttach(Activity activity) {
if (!(activity instanceof OnColorSelectedListener)) {
throw new IllegalStateException("Activity must implement OnColorSelectedListener!");
}
listener = (OnColorSelectedListener) activity;
}
@Override
public void onDetach() {
listener = null;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getActivity());
View view = inflater.inflate(R.layout.palette, container, false);
// call view.findViewById(...) for all your color buttons and
// set the OnClickListener
view.findViewById(...).setOnClickListener(this);
...
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Colores:");
builder.setView(view);
return builder.create();
}
@Override
public void onClick(View v) {
/*
* Determine the color from the view that was clicked. You can use a
* switch statement on v.getId() if they all have IDs, but there are
* other possibilities as well.
*/
int color = ...;
listener.onColorSelected(color);
dismiss();
}
}
答案 1 :(得分:0)
android:onClick仅在扩展视图的Context包含函数(此处为“paintClicked”)时才有效。 因此,如果您没有使用主Activity调整此布局,则可能是因为它不起作用。
将Ids设置为ImageButtons并使用一些findViewById(R.id.btnX).setOnClickListener(myListener)可能会更好;显示按钮后。