Android:如何在Fragment中更新我的textView

15
我正在尝试使用片段构建我的第一个合适的Android应用程序。 我有一个主xml。其中包括两个垂直片段,顶部片段仅包含两个TextView。第一个TextView包含静态文本,第二个TextView包含我最终将从SQL动态获取的值。
如果我将此放在MainActivity.java中,则可以快乐地更新第一个片段中的TextView的值:
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    // Set the Text to try this out
    TextView t = (TextView)findViewById(R.id.viewItem);
    t.setText("Text to Display");
}

我有两个片段XML和一个Java文件来支持每个片段,因此我希望将此字段的设置放入支持片段的Java文件中,而不是MainActivity所用的Java文件中。
当我将其放入片段中时,它看起来像这样:
    public class FragmentMainTop extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState){
    // -- inflate the layout for this fragment
    return inflater.inflate(R.layout.fragmentmt, container,false);

    // Set the Text to try this out
    TextView t = (TextView)findViewById(R.id.viewItem);
    t.setText("Text to Display");
}

但是如果我这样做,TextView那一行会出现错误:

"方法findViewById(int)在类型FragmentMainTop中未定义"

为什么它不知道这个方法呢?我已经使用了ctl/shift/o来确保我有所有正确的导入。 我不想把所有的代码都放在MainActivity中,因为如果我想在另一个活动中使用该片段,我将不得不重复所有的代码。

3个回答

47
你需要将充气的碎片布局分配给一个变量,以便您可以访问其findViewById()方法。然后,在更新小部件完成后,返回它。
@Override
public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState){
    // -- inflate the layout for this fragment
    View myInflatedView = inflater.inflate(R.layout.fragmentmt, container,false);

    // Set the Text to try this out
    TextView t = (TextView) myInflatedView.findViewById(R.id.viewItem);
    t.setText("Text to Display");

    return myInflatedView;
}

通常情况下,在Activity中调用findViewById()时,你是在调用Activity.findViewById()方法。但是在Fragment类中尝试使用相同的调用会失败,因为没有Fragment.findViewById()方法。所以,你必须使用View.findViewById()方法来获取你的小部件的引用,该方法需要传入你的填充视图。


即使我在通过fragment.getActivity()返回的Activity上执行findViewByID,引用仍然可以成功返回。但是动态更新视图仍然无法正常工作。 - zulkarnain shah

2

我不是专家,但我认为方法内的return语句会返回一些东西,而此语句后面的代码将无法执行。

因此,请尝试更改顺序! :)


0
我正在使用从我的活动中更新添加在XML标签中的TextView的代码。这些TextView是类级别的对象。以下是一些代码:
<fragment
    android:id="@+id/fragmentRegister"
    android:name="com.proshore.loveis.RegisterFragment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/view1" />

这里是代码片段,只展示类级别变量。
public class RegisterFragment extends Fragment implements OnClickListener {

TextView textViewDOB, textViewLanguage;

public RegisterFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
//eluded methods here
}
}

现在我更新片段的活动:

public class RegisterActivity extends FragmentActivity {
Button buttonEnter;
RegisterFragment fragmentRegister;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);
    buttonEnter = (Button) findViewById(R.id.buttonEnter);
    fragmentRegister = (RegisterFragment) getSupportFragmentManager()
            .findFragmentById(R.id.fragmentRegister);
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    buttonEnter.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.d("dontknowitwillowrk", fragmentRegister.textViewLanguage
                    .getText().toString());
            fragmentRegister.textViewLanguage.setText("hello mister how do you do");


        }
    });
}
}

注意:不确定这是否是一个好的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接