Android片段:如何在XML中传递值

时间:2015-07-17 19:45:54

标签: android android-fragments

我有一个带有2个TextView对象的简单片段。该片段具有相应的Java类。如何将活动布局XML中的值传递给片段?我想用具有不同值的TextView对象多次实例化同一个片段。

因此,活动XML将类似于:     *

谢谢。

6 个答案:

答案 0 :(得分:1)

每个人似乎都忽略了它,但你可以实际上通过XML传递像标签这样的静态参数。

这有点复杂。首先,您需要声明要在attrs.xml等文件中使用的自定义属性,然后需要覆盖Fragment.onInflate()以检索这些属性的值。

official Android documentation提供了一个简单的示例,说明如何从XML布局中检索标签以在片段中使用它。

答案 1 :(得分:0)

好像你正在使用片段错误。

但是你可以在每个片段java类中使用textview.setText ...

答案 2 :(得分:0)

我猜你在xml中期待某种数据绑定方式(例如在wpf中)。 没有像android那样的数据绑定(至少没有第三方库)。

你所拥有的是片段的onCreateView()方法。 在那里你可以捕获对那些TextView对象的引用,如下所示:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, container,
                false);
       TextView myTextView1 = (TextView)view.findViewById ("textView1");
       TextView myTextView2 = (TextView)view.findViewById ("textView2");
        return view;
    }

在那里你也可以设置那些textViews的值,或者你可以在这样的代码中设置它:

myTextView1.setText ("this is my textview1 test");

因此,总而言之 - 在android中没有典型的内部xml数据绑定,你必须在片段代码中找到这些视图,然后用它们进行操作。

编辑:

如果你在活动的某个地方有数据,并且你想在创建它时将它传递给你的片段,你可以使用片段setArgument()函数(和相应的getArguments())。

你有一个例子:Setting Fragment arguments from Activity - 在接受的答案中。

编辑2:

根据新的数据绑定库,可以像这样进行绑定:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

link:https://developer.android.com/tools/data-binding/guide.html

但请注意,它仍然是测试版。

答案 3 :(得分:0)

您希望将数据传递给片段并让片段使用它。以下文章描述了整个9码:

http://developer.android.com/training/basics/fragments/communicating.html

简而言之: sender to setArguments:

Bundle args = new Bundle();
args.putString("myText", aText);
f.setArguments(args);

接收片段以检索参数:

String text = getArguments().getInt("myText"); // myTextView.setText(...)

答案 4 :(得分:0)

以下是Fragment的示例。请注意您与TextView互动的方式。您只需要创建任意数量的片段并将它们放入ArrayList,这样您就可以从所有片段中获取信息。

public class Yourfragment extends Fragment {

    private TextView mTextView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        return inflater.inflate(R.layout.your_fragment, container, false);

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        View _view = getView();

        if(_view != null){

            mTextView = (EditText) _view.findViewById(R.id.your_textView);

        }

    }

}

答案 5 :(得分:0)

要回答你的问题,

你需要有一个扩展Activity类的mainclass,你将从中实例化fragmnet。并且您需要一个包含这两个TextView对象的片段类,并使用参数化构造函数对类变量进行广告。因此,您需要维护一个Map,其中包含您的片段名称和textviewvalue1&#34; +&#34; textviewvalue2。所以现在在创建片段的实例时,您可以将映射中的值yiu作为参数发送到该片段构造函数。

像这样:

public class Yourfragment extends Fragment { 
private TextView mTextView1;
private TextView mTextView2;

public Yourfragment(String txt1,String txt2){
    super();
    this.mTextView1.setText(txt1);
    this.mTextView2.setText(txt2);
}
 @Override public View
  onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
  //ur logic
} 
@Override public void onActivityCreated(Bundle savedInstanceState) {
 super.onActivityCreated(savedInstanceState);
 //ur logic
 }
 } } 

在您实例化的地方,使用map.get( fragmentname).split("+")[0]map.get( fragmentname).split("+")[1]作为参数来构造,并将片段的标题设置为fragmentname