2017-02-14 2 views
3

Я пытаюсь перехватить каждый виджет вида, который накачивается в моей активности и переопределяет функциональность setText этого представления, если он существует.Перехватить каждый элемент вида, накачанный?

Так что если TextView имеет андроид: text = "bla" в XML-макете, я хочу иметь возможность перехватить это и, возможно, добавить ** в конце всех текстов, заданных из xml.

Один из способов, который, кажется, близок к тому, что мне нужно, - использовать накладную упаковку Custom Layout.

LayoutInflaterCompat.setFactory(layoutInflator, InflatorOnSteriods(this)) 

и в моем InflatorOnSteriods переопределить onCreateView, а затем перехватывать все точки зрения там .. этот подход, кажется, не работает. onCreateView никогда не вызывается.

Я попробовал также использовать cloneInContext

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

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

Update:

Хотя я не думаю, что его отношение; Код 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' на ваш вопрос? – petey

+0

Я добавил код @petey, хотя класс сейчас ничего не делает ... поэтому я не думаю, что это проблема .. и мой вопрос в том, что даже правильный подход, потому что это может быть не так. –

+0

«Итак, если TextView имеет андроид: text =« bla »в макете XML, я хочу, чтобы он мог перехватить это и, возможно, добавить ** в конце всех текстов, заданных из 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 
     } 
} 

Проблема с моим кодом было то, что он всегда был сбой с странные ошибки, что я не мог устранить, пока я понял, что мне нужно добавить ? после View, так как я использую Котлин и родительское представление может быть пустым :)

Удачного программирования

Хорошая ссылка может быть найдена here

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