Android:处理Fragment中的用户输入

时间:2014-01-25 14:17:42

标签: java android android-fragments

我的测试项目主要活动如下:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.display_message, menu);
        return true;
    }

    public void sendMessage(View view){
        FragmentManager frManager = getFragmentManager();
        FragmentTransaction transaction = frManager.beginTransaction();
        Frag fr= new Frag();
        transaction.add(R.id.stuuf, fr);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

以下主要布局:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/stuuf"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:paddingTop="?android:attr/actionBarSize" >

    <Button android:id="@+id/submit_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send"
        android:onClick="sendMessage"/>

    </TableLayout>

当用户点击该按钮时,将显示以下片段,其中包含第二个按钮:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Frag" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="180dp"
        android:onClick="buttonClicked"
        android:text="Button" />
    </RelativeLayout>

应该控制它的类:

public class Frag extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return inflater.inflate(R.layout.frag_test, null);
    }

    public void buttonClicked(){
        System.out.println("Hello!");
    }

}

现在,有一个问题,当我点击第二个按钮时,系统会在MainActivity中查找buttonClicked()方法,而不是在Frag中查找,从而给我以下错误:

java.lang.IllegalStateExcetion: Could not find method buttonClicked(View) in the activity class com.spacitron.mytestproject.MainActivity for onClick handler on view class android.widget.Button with id 'button1'

显然我应该能够处理碎片类本身片段中发生的事情所以我必须做一些完全错误的事情,我只是无法确定是什么。

3 个答案:

答案 0 :(得分:2)

看起来你错过了一些步骤,把它放在你的第二个片段中(并从xml中删除onClick)

public void onViewCreated(View view, ...) {

    View btn = view.findViewById(R.id.button1);
    btn.setOnClickListener(new View.OnClickLisener() {

        public void onClick(View view) {
            Log.d("My App", "The button was clicked");
        }

    }

}

答案 1 :(得分:2)

问题是您在片段布局中使用onClick方法,并且Android期望在活动中找到它。有两种方法可以解决这个问题:

  1. 最健康:从XML中删除onClick属性并依赖OnClickListener实施。
  2. 将来自activity的调用委托给片段 - 在activity中声明方法并将其委托给片段。如下所示:
  3. 在活动类中有这个:

    public void buttonClicked(View view){
        Fragment current = getFragmentManager().findFragmentById(R.id.stuuf);
        if(current != null) {
            ((Frag)current).buttonClicked();
        }
    }
    

    从长远来看,我强烈建议不要使用onClick XML属性。原因在this SO answer中解释。

答案 2 :(得分:0)

片段构建在活动之上,而onClick属性与han活动相关联。

我建议你对两个按钮使用ClickListeners: -

@Override
public void onViewCreated((View view, Bundle savedInstanceState) {
Button fragmentButton = (Button)view.findViewById(R.id.button1);
fragmentButton.setOnClickListener(new View.OnClickLisener() {

    public void onClick(View view) {
        //Do Something here
    }

});

}