从活动调用片段方法的问题

时间:2015-02-05 17:46:55

标签: java android android-activity android-fragments

我遇到了称为表单活动的片段方法的问题。 为了创建片段并调用方法,我使用位于MainActivity.java中的这个方法:

public void createFragment (int select, String string) {
    switch (select) {
        case 1:
            ErrorFragment errorFragment = new ErrorFragment();
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragError, errorFragment)
                    .commit();

            errorFragment = (ErrorFragment) getSupportFragmentManager().findFragmentById(R.id.fragError);

            errorFragment.setText(string);

            break;
        case 2:
            StringFragment stringFragment = new StringFragment();
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragString, stringFragment)
                    .commit();

            stringFragment = (StringFragment) getSupportFragmentManager().findFragmentById(R.id.fragString);

            stringFragment.setText(string);

            break;
    }
}

除了textViews和layout的名称之外,片段具有相同的布局和类。

ErrorFragment.java:

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

public class ErrorFragment extends Fragment {

    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_error,container,false);
    }

    public void setText(String text) {
        TextView textView = (TextView) getActivity().findViewById(R.id.errorOut);
        textView.setText(text);
    }
}

fragment_error.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/errorTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/error"
        android:textColor="#FF0000"
        android:textSize="25sp"
        android:gravity="center|top"/>

    <TextView
        android:id="@+id/errorOut"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:textSize="20sp"
        android:text=""
        android:gravity="center|top"/>
</LinearLayout>

某些按钮

调用createFragment()

经过一些测试后,我注意到片段已创建,但是当我调用“errorFragment.setText;”时应用程序崩溃。 在案例2中,应用程序不会崩溃,但文本视图不会显示(我注意到,如果我快速单击按钮,textView会显示几毫秒)

编辑: 我尝试这样做,但应用程序仍然崩溃

2 个答案:

答案 0 :(得分:0)

似乎您尝试将文本设置为的TextView位于片段布局中。你应该在你的两个片段中这样做。

你试图在文本视图中设置文本的方式,android试图在活动的布局中找到它,而不是在片段的布局中。这就是您的应用崩溃的原因(可能是NullPointerException

private View view = null;
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_error,container,false);
    return view;
}

public void setText(String text) {
    TextView textView = (TextView) view.findViewById(R.id.errorOut);
    textView.setText(text);
}

答案 1 :(得分:0)

我认为@ Rohit5k2在他的解释中是正确的,但不是在视图中夸大片段布局,而是应该使用XML文件中的相同布局,在您的情况下是一个LinearLayout。

所以试试这个:

private LinearLayout layout = null;

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    layout = (LinearLayout) inflater.inflate(R.layout.fragment_error,container,false);
    return layout;
}

public void setText(String text) {
    TextView textView = (TextView) layout.findViewById(R.id.errorOut);
    textView.setText(text);
}