Android Fragment 中的自定义属性

发布于 2024-12-22 18:15:07 字数 256 浏览 0 评论 0原文

我想使用 XML(不使用捆绑附加参数)在 Android 片段中定义自定义属性,例如自定义控件中的 declare-styleable 。但是没有带有AttrSet参数的构造函数,那么可以吗?我可以重写 public void onInflate(android.app.Activity Activity, android.util.AttributeSet attrs, android.os.Bundle savingInstanceState) 以获得属性支持吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

那些过往 2024-12-29 18:15:07

Support4Demos 的链接已更改或可以更改,因此发布完整的解决方案。就这样吧。

  1. 在 res/values 文件夹中创建 attrs.xml 文件。或者如果文件已存在,则添加以下内容。

     
     <资源>
     
         
         ;
      
    
  2. 重写片段的onInflate委托并读取其中的属性

    <前> <代码> / **
    * 在膨胀期间将属性从视图层次结构解析为
    * 我们处理的参数。
    */
    @覆盖
    公共无效onInflate(活动活动,属性集属性,捆绑包保存实例状态){
    super.onInflate(活动,attrs,savedInstanceState);
    Log.v(TAG,"onInflate 被调用");

    TypedArray a = Activity.obtainStyledAttributes(attrs,R.styleable.MyFragment);

    CharSequence myString = a.getText(R.styleable.MyFragment_my_string);
    if(myString != null) {
    Log.v(TAG, "我的字符串已收到:" + myString.toString());
    }

    int myInteger = a.getInt(R.styleable.AdFragment_my_integer, -1);
    if(myInteger != -1) {
    Log.v(TAG,"我收到的整数:" + myInteger);
    }

    a.回收();
    }

  3. 将这些属性传递到布局文件中,如下所示。只是一个例子

     
     
    
         <文本视图
             安卓:layout_width =“wrap_content”
             安卓:layout_height =“wrap_content”
             android:text="这是 android 活动"/>
    
         <片段
             android:id="@+id/ad_fragment"
             android:name="com.yourapp.packagename.MyFragment"
             安卓:layout_width =“fill_parent”
             安卓:layout_height =“50dp”
             机器人:layout_alignParentBottom =“真”
             app:my_string="您好,这是硬编码字符串。不要使用我"
             应用程序:my_integer =“30”/>
    
     
    

仅此而已。它是一个可行的解决方案。

执行此操作时,如果您在 xml 中看到任何命名空间错误。
一次又一次尝试项目清理。
这很可悲,但 Eclipse 和 adt 有时会表现不佳。

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.

要走就滚别墨迹 2024-12-29 18:15:07
@Override
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
    super.onInflate(activity, attrs, savedInstanceState); 
    // Your code here to process the attributes
}
@Override
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
    super.onInflate(activity, attrs, savedInstanceState); 
    // Your code here to process the attributes
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文