Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom attributes in Android fragments

I'd like to define custom attributes in Android fragment using XML (without using bundle additional parameters) like declare-styleable in custom controls. But there are no constructors with AttrSet parameters, so is it possible? Can i just override public void onInflate(android.app.Activity activity, android.util.AttributeSet attrs, android.os.Bundle savedInstanceState) in order to get attributes support?

like image 621
Anton Avatar asked Dec 27 '11 05:12

Anton


People also ask

How are fragments created in android?

The android:name attribute specifies the class name of the Fragment to instantiate. When the activity's layout is inflated, the specified fragment is instantiated, onInflate() is called on the newly instantiated fragment, and a FragmentTransaction is created to add the fragment to the FragmentManager .

How many types of fragments are there in android?

In Activity 1, there are two fragments, Fragment A and Fragment B. When we select an item from Fragment A, it gets open in Fragment B of the same activity. In the case of mobiles, there are two activities that are: Activity 1 with Fragment A and Activity 2 with Fragment B.


1 Answers

The Link for Support4Demos is changed or can be changed so posting the complete solution. Here it goes.

  1. Create attrs.xml file in res/values folder. Or add the below content if file already exists.

    <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyFragment">     <attr name="my_string" format="string"/>     <attr name="my_integer" format="integer"/> </declare-styleable>  

  2. Override the onInflate delegate of fragment and read attributes in it

    /**  * Parse attributes during inflation from a view hierarchy into the  * arguments we handle.  */ @Override public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {     super.onInflate(activity, attrs, savedInstanceState);     Log.v(TAG,"onInflate called");      TypedArray a = activity.obtainStyledAttributes(attrs,R.styleable.MyFragment);      CharSequence myString = a.getText(R.styleable.MyFragment_my_string);     if(myString != null) {         Log.v(TAG, "My String Received : " + myString.toString());     }      int myInteger = a.getInt(R.styleable.AdFragment_my_integer, -1);     if(myInteger != -1) {         Log.v(TAG,"My Integer Received :" + myInteger);     }      a.recycle(); } 
  3. Pass these attributes in your layout file as following. Just an example

    <?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"     android:layout_width="match_parent"     android:layout_height="match_parent" >      <TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="This is android activity" />      <fragment         android:id="@+id/ad_fragment"         android:name="com.yourapp.packagename.MyFragment"         android:layout_width="fill_parent"         android:layout_height="50dp"         android:layout_alignParentBottom="true"         app:my_string="Hello This is HardCoded String. Don't use me"         app:my_integer="30" />  </RelativeLayout> 

Thats all. Its a working solution.

While doing this if you see any namespace error in xml. try project cleaning again and again. This is pathetic but eclipse and adt misbehaves sometimes.

Hope it helps others :)

Cheers

like image 85
Rohit Sharma Avatar answered Oct 12 '22 06:10

Rohit Sharma