2013-03-10 82 views
14

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

如果我把这个是我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,我将不得不重复所有的代码。

回答

45

您需要充气片段布局分配给一个变量,这样就可以访问它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()与您的虚拟视图来获取对您的小部件的引用。

+0

引用被成功地返回偶数。但动态更新视图仍然不起作用 – 2017-06-11 08:58:38

2

我不是专家,但我要说的方法内return语句返回的东西,这个声明之后的下一行是无法访问:o

因此,试图改变顺序! :)

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"); 


     } 
    }); 
} 
} 

注:不知道这是一个好办法。当我在()的返回fragment.getActivity活动做findViewByID