Android:如何更新片段中的textView

时间:2013-03-10 12:31:28

标签: android dynamic android-fragments textview

我正在尝试使用片段来构建我的第一个正确的Android应用程序。 我有一个主要的xml。它由两个垂直片段组成,顶部片段只包含两个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中,因为如果我想在另一个活动中使用Fragment,我将不得不重复所有代码。

3 个答案:

答案 0 :(得分: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;
}

通常,当您在findViewById()内拨打Activity时,您正在调用Activity.findViewById()。在Fragment类中尝试相同的调用将失败,因为没有这样的Fragment.findViewById()方法。因此,您必须在充气视图中使用View.findViewById()来获取对小部件的引用。

答案 1 :(得分:2)

我不是专家,但我会说方法中的return语句会返回一些内容,并且此语句后面的下一行无法访问:O

所以尝试改变顺序! :)

答案 2 :(得分: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");


        }
    });
}
}

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