片段中的按钮单击事件

时间:2014-11-26 21:20:07

标签: java android xml

首先,我想说我正在研究Android文档,所以到目前为止我还没有太多关于这个主题的知识。这是我写的代码:

public class Android extends Fragment {
    @Override

        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            View prime = inflater.inflate(R.layout.android_frag, container, false);

            //I have a spinner with multiple choices here. The Spinner has the id 'convtype'
            Spinner spinner = (Spinner) prime.findViewById(R.id.convtype);
            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity().getBaseContext(),
                    R.array.planets_array, android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner.setAdapter(adapter);

            return prime;
         }

        private String getGradi(String a) {     
            return a+"°";
        }

         //This method is called when I click a button
         public void convertStart(View v) {

             Spinner spinner = (Spinner) v.findViewById(R.id.convtype);
             int indice = spinner.getSelectedItemPosition();
             EditText mEdit = (EditText) v.findViewById(R.id.unita);

             String gradi = getGradi("65");
             mEdit.setText(gradi);

         }

}

下面你可以找到关于我在app中创建的按钮的XML部分:

<Button
        android:id="@+id/button1"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="@string/calcola"
        android:onClick="convertStart" />

根据我的理解,这段代码应该是正确的但是当我尝试在我的模拟器中运行应用程序时会出现错误并且它告诉我不幸的是我的应用程序已停止。

我猜convertStart(View v)有v参数在方法中使用,但在android:onClick我没有传递任何参数。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

问题是您在android:onClick XML属性中引用的函数必须位于视图的Context中。 Fragment不是Context,因此Android不会在您的片段中查找convertStart(View)方法。

android:onClick文档中记录了这一点,但这并未明确指出“上下文”实际上意味着Context

如果要使用XML属性,则需要将convertStart()放在Activity中。或者,您可以在片段中的视图上调用setOnClickListener()以在片段中创建回调。

我自己更喜欢后一种方法,因为我发现以这种方式遵循应用程序的逻辑流程要容易得多。它也不太容易出现无辜行为可能发生的错误,例如重命名方法或尝试在其他地方使用此布局。

答案 1 :(得分:1)

在返回素数

之前将它放在onCreateView方法上
final Button button = (Button) prime.findViewById(R.id.button1);
     button.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
             // Perform action on click
         }
     });