在Fragment Classes中操作变量

时间:2016-11-22 11:17:41

标签: android android-fragments

使用以下Fragment类:

public class TestFrag extends Fragment {

    public TextView tViewA;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.mainmenu, container, false);
        tViewA = (TextView)view.findViewById(R.id.texta);
    return view;
    }

    public void setTViewText(String textToSet){
        tViewA.setText(textToSet);
    }
}

和MainActivity类:

public class MainActivity extends FragmentActivity {


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


    public void doStuff(View view){
        TestFrag myf = new TestFrag ();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.container, myf);
        transaction.commit();

        myf.setTViewText("test");
    }
}

当调用setTViewText文本时,应用程序将崩溃,从而产生空指针异常。

TextView在XML

中声明
    <TextView
    android:text="Change Me"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:layout_marginStart="24dp"
    android:layout_marginTop="19dp"
    android:id="@+id/texta" />

我一直试图解决这个问题。什么是在片段类中声明和操作变量的正确方法?

1 个答案:

答案 0 :(得分:1)

您的方法存在的问题是您正在尝试将字符串设置为尚未在片段上呈现的textView。所以你的setTViewText()在onCreateView()之前调用。只有在系统调用onCreateView()方法之后才能调用setTViewText(),在该方法中,您将对textView的引用分配给tViewA。

您应该使用setArgument()方法将值传递给fragment。

TestFrag myf = new TestFrag ();
Bundle args = new Bundle();
args.putString("arg_text", your_string);
myf.setArgument(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.container, myf);
transaction.commit();

在片段的onCreateView中,您可以通过

访问此值
String yourString = getArgument().getString("arg_text");
tv.setText(yourString);