使用Fragment时出现异常

时间:2013-10-01 18:15:24

标签: java android fragment

我正在尝试在活动中创建一个片段,但我得到以下异常:

  

java.lang.IllegalArgumentException:找不到id

的视图

这是activity_main.xml

<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">

    <EditText
        android:id="@+id/editText_str"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText_str"
        android:ems="10" />

    <Button
        android:id="@+id/btn_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText_num"
        android:text="Update" />

</RelativeLayout>

这是content_layout.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</FrameLayout>

这是MainActivity.java

package com.example.example24;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends FragmentActivity {
    private EditText editText_str, editText_num;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText_str = (EditText) findViewById(R.id.editText_str);
        editText_num = (EditText) findViewById(R.id.editText_num);
        Button btn_update = (Button) findViewById(R.id.btn_update);
        btn_update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyFragment newFragment = new MyFragment();
                Bundle args = new Bundle();
                args.putString("str", editText_str.getText().toString());
                args.putInt("num", Integer.valueOf(editText_num.getText().toString()));
                newFragment.setArguments(args);
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.fragment_container, newFragment);
                transaction.addToBackStack(null);
                transaction.commit();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

这是MyFragment.java

package com.example.example24;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MyFragment extends Fragment{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String str = getArguments().getString("str");
        int num = getArguments().getInt("num");
        return inflater.inflate(R.layout.content_layout, container, false);
    }
}

2 个答案:

答案 0 :(得分:0)

您正在使用布局R.layout.activity_main,然后尝试将片段设置为不属于布局的R.id.fragment_container

答案 1 :(得分:0)

您需要在xml中使用一个视图组,以便以编程方式将该片段添加到视图组。

http://developer.android.com/guide/components/fragments.html

使用add()代替replace()

如果要替换添加到容器中的现有片段,请使用replace()

所以改为

   transaction.add(R.id.fragment_container, newFragment);

传递给add()的第一个参数是ViewGroup,其中应放置fragment,由资源ID指定,第二个参数是要添加的片段。

    <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">

    <EditText
        android:id="@+id/editText_str"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText_str"
        android:ems="10" />

    <Button
        android:id="@+id/btn_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText_num"
        android:text="Update" />
    <LinearLayout
            android:id="@+id/fragment_container"
            android:layout_below="@+id/btn_update"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
    </LinearLayout>


</RelativeLayout>