从主Activity中的片段获取EditText值

时间:2017-09-04 14:14:24

标签: android android-fragments

我在片段中放置了三个编辑文本,并希望从主活动中获取片段中编辑文本的值。我尝试了以下代码,但在 getName()方法中抛出 nullpointerexception

片段类

public class Fragment1 extends Fragment{

EditText name, age, gender;


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

    View view = inflater.inflate(R.layout.frag1, container);

    name = (EditText) view.findViewById(R.id.name);
    age = (EditText) view.findViewById(R.id.age);
    gender = (EditText) view.findViewById(R.id.gender);

    return view;
}

public String getName(){
    String name1 = name.getText().toString().trim();
    return name1;
}
public String getAge(){
    String age1 = age.getText().toString().trim();
    return age1;
}
public String getGender(){
    String gender1 = gender.getText().toString().trim();
    return gender1;
}
}

MainActivity

public class MainActivity extends AppCompatActivity {


Fragment1 f1;
Button b1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b1 = (Button) findViewById(R.id.button);
    f1 = new Fragment1();

    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, f1.getName() +" "+ f1.getAge() +" "+ f1.getGender(), Toast.LENGTH_SHORT).show();
        }
    });
}
}

修改

activity_main.xml中

这是我的主要活动ui

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ganesh.fragtask.MainActivity">

<fragment
    android:id="@+id/fragment"
    android:name="com.example.ganesh.fragtask.Fragment1"
    android:layout_width="match_parent"
    android:layout_height="120dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true" />

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="50dp"
    android:text="Button" />
</RelativeLayout>

logcat的 这是我点击按钮时得到的例外

FATAL EXCEPTION: main
                                                                       Process: com.example.ganesh.fragtask, PID: 6015
                                                                       java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
                                                                           at com.example.ganesh.fragtask.Fragment1.getName(Fragment1.java:33)
                                                                           at com.example.ganesh.fragtask.MainActivity$1.onClick(MainActivity.java:25)
                                                                           at android.view.View.performClick(View.java:5611)
                                                                           at android.view.View$PerformClick.run(View.java:22276)
                                                                           at android.os.Handler.handleCallback(Handler.java:751)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6195)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:764)

3 个答案:

答案 0 :(得分:1)

事情是f1 = new Fragment1();你刚刚为fragment类创建了一个对象,但这不是调用fragment的确切方法。您应该使用transition设置fragmentManager。如果您没有以这种方式设置,那么将不会调用frgament Lifecycle方法。因此,在您的方案中,将不会调用onCreateView()并且未初始化视图(因为您的stackTrace明确指出视图未初始化)。请尝试以下代码

f1 = new MainFragment();
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_frame, f1, 
f1 .getClass().getSimpleName()).addToBackStack(null).commit();

我希望你知道另一个片段容器。在FrameLayout中有一个MainActivity并将Fragment添加到该容器中。

希望这有用:)

答案 1 :(得分:0)

f1 = new Fragment()

这不是你添加片段的方式。您只是在这里创建一个新的片段实例。片段的onCreateView永远不会被调用,因为片段尚未添加。因此,editText变量为null,您将获得异常。请稍微研究片段。

http://www.vogella.com/tutorials/AndroidFragments/article.html

这是你添加片段的方式:

getSupportFragmentManager().beginTransaction().add(R.id.frag_layout_id, f1, "fragment_identifier").commit();

修改

由于问题是用xml编辑的,虽然你已经用XML声明了片段,但java中的f1实例并没有引用它。要获取通过xml添加的实例的句柄,请使用此

Fragment_Example f1 = (Fragment_Example)getSupportFragmentManager().findFragmentById(R.id.fragment);

答案 2 :(得分:0)

我认为您的姓名,年龄和性别观点未初始化: 尝试更改 onCreateView(),就像这样

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.frag1, container);
    name = (EditText) view.findViewById(R.id.your_id);
    age = (EditText) view.findViewById(R.id.your_id);
    gender = (EditText) view.findViewById(R.id.your_id);

    return view;
}