2017-02-14 1 views
3

私はアクティビティで膨らんでいるすべてのビューウィジェットをインターセプトし、そのビューのsetText機能が存在する場合はそれをオーバーライドしようとしています。すべてのビュー要素が膨張しているのを傍受しますか?

XMLレイアウトでTextViewにandroid:text = "bla"がある場合、それを傍受してxmlから設定されているすべてのテキストの末尾に**を追加したいと考えています。

私が必要とするものに近いと思われる方法の1つは、カスタムレイアウトインフレータを使用することです。私InflatorOnSteriodsで

LayoutInflaterCompat.setFactory(layoutInflator, InflatorOnSteriods(this)) 

とonCreateView上書きした後、そこにすべてのビューを傍受...このアプローチはまったく機能していないようです。 onCreateViewは決して呼び出されません。

私はcloneInContext

LayoutInflaterCompat.setFactory(layoutInflater.cloneInContext(this), InflatorOnSteriods(this)) 

を使用することも試みたが、同様に運が、多分私のアプローチは、私はまた、私が提示されているすべてのビューを傍受することができますし、特定のセットであることを別の方法に開いています完全に間違っていませんそのビューの特定の属性私が最後にそのビューを変更し、システムが自分の変更を尊重し、後でそれらを変更しないようにすることは、本当に重要です。

更新:

私はその関連はないと思うが。私は最終的に私はインフレータ工場溶液で欲しかったものを達成するために管理私の解決策をトラブルシューティングするいくつかの時間後InflatorOnSteroids.ktのコード

class InflatorOnSteriods(val appCompatActivity: AppCompatActivity) : LayoutInflaterFactory { 

override fun onCreateView(parent: View, name: String, context: Context, attrs: AttributeSet): View { 
    var result: View 

    if (TextUtils.equals(name, "DebugDrawerLayout")) { 
     result = ImageView(context, attrs) 
    } 
    result = appCompatActivity.onCreateView(name, context, attrs) 
    if (result == null) { 
     // Get themed views from app compat 
     result = appCompatActivity.delegate.createView(parent, name, context, attrs) 
    } 
    return result 
} 
} 
+0

は、あなたの質問に 'InflatorOnSteriods'クラスのコードを追加することができますhere見つけることができますか? – petey

+0

クラスは現在何もしていませんが、@peteyというコードを追加しました。だから私はその問題を考えません。そして私の質問は正しいアプローチであっても、そうではないかもしれません。 –

+0

"TextViewにXMLレイアウトのandroid:text =" bla "がある場合、それを傍受してxmlから設定されているすべてのテキストの最後に**を追加したいと思っています。これはどこに起こっているのですか? (また、その偉大なあなたはkotlinを使用しています) – petey

答えて

1

まず、カスタムインフレータが設定された抽象アクティビティを作成します。あなたがする必要がある

abstract class SteroidsActivity : AppCompatActivity() { 

var mInflater: LayoutInflater? = null 
abstract fun getActivityLayout(): Int 

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    mInflater = layoutInflater?.cloneInContext(this) 
    LayoutInflaterCompat.setFactory(mInflater, InflaterOnSteroids(this)) 
    setContentView(getActivityLayout()) 
} 

override fun getLayoutInflater(): LayoutInflater? { 
    return mInflater 
} 

override fun getSystemService(name: String): Any? { 
    if (name == LAYOUT_INFLATER_SERVICE) { 
     if (mInflater == null) { 
      mInflater = super.getSystemService(name) as LayoutInflater 
     } 
     return mInflater 
    } 
    return super.getSystemService(name) 
    } 
} 

第二のものは、私のコードの問題は、それが常に私まで、トラブルシューティングを行うことができませんでした奇妙なエラーでクラッシュしたことで、カスタムインフレータ工場

class InflaterOnSteroids(appCompatActivity1: AppCompatActivity) : LayoutInflaterFactory { 

    override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? { 
     //Do stuff here and return a view 
     return null 
     } 
} 

を作成していますを追加する必要があることを認識しましたか?閲覧後の iはnullに:)することができkotlinと親ビューを使用していますので、

ハッピープログラミング

グッド参照

関連する問題