Передать набор атрибутов из фрагмента в пользовательское представление в XML
В следующих файлах у меня в основном есть фрагмент, который содержит 2 пользовательских вида (View_A, View_B). Оба представления могут быть настроены через атрибут в XML.
Я пытаюсь передать атрибут фрагмента в атрибуты пользовательских представлений, используя только XML.
Вот основной пример того, чего я пытаюсь достичь:
Пользовательский вид A, Пользовательский вид B и фрагмент
public class View_A extends HorizontalScrollView {
private int A_1;
public View_A(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray attributes = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.View_A,
0,0);
try{
this.A_1 = attributes.getInteger(R.styleable.View_A_A_1, 0);
}finally {
attributes.recycle();
}
}
}
public class View_B extends View {
private int B_1;
public View_B(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray attributes = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.View_B,
0,0);
try{
this.B_1 = attributes.getInteger(R.styleable.View_B_B_1, 0);
}finally {
attributes.recycle();
}
}
}
public class MyFragment extends Fragment {
View_A view_A;
View_B view_B;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_view,container,false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view_A = (View_A) view.findViewById(R.id.view_A);
view_B = (View_B) view.findViewById(R.id.view_B);
view_A.setView_B(view_B);
}
@Override
public void onInflate(Context context, final AttributeSet attrs, Bundle savedInstanceState) {
super.onInflate(context, attrs, savedInstanceState);
}
}
attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="A_1" format="integer"/>
<attr name="B_1" format="integer"/>
<declare-styleable name="View_A">
<attr name="A_1"/>
</declare-styleable>
<declare-styleable name="View_B">
<attr name="B_1"/>
</declare-styleable>
<declare-styleable name="MyFragment">
<attr name="A_1"/>
<attr name="B_1" />
</declare-styleable>
</resources>
Макет моего фрагмента
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<View_A
android:id="@+id/view_A"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.constraint.Guideline
android:id="@+id/guideLine"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.1" />
<View_B
android:id="@+id/view_B"
android:layout_width="0dp"
tools:layout_width="360dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/guideLine"
</android.support.constraint.ConstraintLayout>
</View_A>
</RelativeLayout>
Как я заявляю свой фрагмент
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.timelinebartempsproject.MainActivity">
<fragment
android:id="@+id/myFragment"
android:name="com.example.MyFragment"
android:layout_width="match_parent"
android:layout_height="300dp"
app:A_1="13"
app:B_1="6" />
</RelativeLayout>