【问题标题】:Android : How do I update my textView in a FragmentAndroid:如何在片段中更新我的 textView
【发布时间】:2013-02-25 15:56:57
【问题描述】:

我正在尝试使用片段来构建我的第一个合适的 Android 应用程序。 我有一个主要的 xml。它由两个垂直片段组成,顶部片段仅由两个 TextView 组成。其中第一个包含静态文本,第二个包含一个值,我最终将从 SQL 动态获取。

如果我把这是我的 MainActivity.java 那么它会很高兴地更新我的第一个 Fragment 中 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 行上收到错误:

“FragmentMainTop 类型的 findViewById(int) 方法未定义”

那为什么它不知道这个方法呢?我有 ctl/shift/o 所以我知道我有所有正确的进口。 我不想最终将所有代码都放在 MainActivity 中,因为如果我想在另一个活动中使用 Fragment,我将不得不重复所有代码。

【问题讨论】:

    标签: android dynamic android-fragments textview


    【解决方案1】:

    我正在使用我活动中的这段代码来更新添加到 xml 标记中的文本视图。 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");
    
    
            }
        });
    }
    }
    

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

    【讨论】:

      【解决方案2】:

      您需要将膨胀的片段布局分配给一个变量,以便您可以访问其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,引用也会成功返回。但是动态更新视图仍然不起作用
      【解决方案3】:

      我不是专家,但我会说方法中的 return 语句会返回一些东西,并且该语句之后的下一行是无法访问的:O

      所以尝试更改顺序! :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多