2015-07-17 4 views
0

У меня есть простой фрагмент с 2 объектами TextView. Фрагмент имеет соответствующий класс Java. Как передать значения из XML макета операции в фрагмент? Я хочу несколько экземпляров одного и того же фрагмента с объектами TextView, имеющими разные значения.Фрагмент Android: как передать значения в XML

Таким образом, деятельность XML будет что-то вроде: *

Спасибо.

ответ

0

Я предполагаю, что вы ожидаете какой-то способ связывания данных в XML (например, как в МОФ). В андроиде нет привязки данных (по крайней мере, без сторонних библиотек).

У вас есть метод 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"); 

Итак, в заключение - нет типичного внутри XML-привязки данных в android, вы должны найти эти представления в коде фрагмента, а затем манипулировать ими.

EDIT:

, если у вас есть данные где-то в деятельности, и вы хотите передать его на фрагмент, когда вы создаете его, вы можете использовать фрагмент setArgument() функция (и соответствующие getArguments()).

У вас есть пример здесь: Setting Fragment arguments from Activity - в принятом ответе.

EDIT 2:

Согласно новым данным Binding библиотеки это можно сделать обязательным, как это:

<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> 

ссылка: https://developer.android.com/tools/data-binding/guide.html

Но обратите внимание, что это все еще бета-версия.

+0

Итак, я должен был бы иметь множество условий «если» и сказать: if (name.equals («configFragment»)) {text1.setText («Config»); text2.setText («Описание конфигурации»;) if (name.equals («planFragment»)) {text1.setText («План»); text2.setText («Описание плана»); } etc ... Это то, что вы подразумеваете под своим ответом? Thx – Matyas

+0

Можете ли вы объяснить, если ваш вопрос: 1.) Можно ли поместить данные в макет xml и использовать его в фрагменте в привязке данных или настройке? - ответ - нет. или 2.) Как передавать данные между фрагментом и активностью? – daneejela

+0

Да, вопрос был 1), поэтому я очень озадачен, что это невозможно. Я просто пытаюсь создать индивидуальные значки на главном экране с единым макетом и иметь на них разные ярлыки. Это можно сделать в коде, но просто кажется странным, что он не поддерживается. Возможно, я атакую ​​это с неправильным углом? Я просто хочу использовать повторно используемые компоненты пользовательского интерфейса с некоторыми данными, которые вводятся при создании экземпляра. – Matyas

0

Похоже, вы собираетесь использовать фрагмент неправильно.

Но тем не менее, вы можете просто использовать textview.setText в каждом фрагменты Java класса ...

+0

Не знаете, почему я собираюсь о фрагментах неправильно. Разве они также не должны быть многоразовыми и динамическими кусками пользовательского интерфейса? Я просто хочу настраиваемый фрагмент, где я могу передавать значения в XML-макете активности. Предлагаете ли вы использовать разные классы Java (по одному для каждой конфигурации содержимого TextView) для одного и того же фрагмента макета xml? – Matyas

0

вы хотите передать данные фрагменту и использовать его. В следующей статье описывается весь 9 двор:

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

Короче: отправителя к setArguments:

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

получающее Fragment для извлечения аргумент:

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

Есть ли способ установить аргументы через XML-макет? – Matyas

+0

Это не имеет смысла.Этот код предназначен для перехода между объектом из класса java. Это не для xml –

+0

В классе Activity вы можете сначала получить удержание значения в макете виджета, передать его классу Framgment. Да, Леннон прав: это Java-код для передачи объекта/значений с использованием шаблона MVC. возможно, вы из фонового представления .NET о привязке данных в файле xmal? Я не думаю, что это можно сделать в файле макета Android. – Sean

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

     } 

    } 

} 
0

Чтобы ответить на ваш вопрос,

вам нужно иметь MainClass простирающуюся Activity класс, от которого вы будете создания экземпляра fragmnet. И вам нужен класс фрагмента с этими двумя объектами ad12 и переменными класса с параметризованным конструктором. Поэтому вам нужно поддерживать Map, у которого есть ключ как имя вашего фрагмента и textviewvalue1 «+» 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] в качестве параметров conatructor и задать заголовок фрагмента fragmentname

1

Все, кажется, игнорируют это, но вы может действительно передавать статические аргументы, подобные метке через XML.

Это немного сложно. Сначала вам нужно объявить пользовательские атрибуты, которые вы хотите использовать в файле, например attrs.xml, тогда вам нужно переопределить Fragment.onInflate(), чтобы получить значение этих атрибутов.

official Android documentation содержит простой пример того, как извлечь метку из макета XML для использования в фрагменте.

Смежные вопросы