2017-11-30 10 views
1

안드로이드 용 Kotlin 또는 Kotlin의 조각 밖에서 인터페이스를 인스턴스화 할 수 없습니다. 그것은 자바 표준 절차가 말을이었다 같은 : mInterfaceListener 어떻게 인터페이스는 코 틀린 인스턴스화되는Kotlin에서 인터페이스 리스너 인스턴스화하기

같은 인터페이스가 아닌 OnClickListener를 또는 아무것도를 참조한다

MyInterface mInterfaceListener = new MyInterface(this); 
mInterfaceListener.invokeSomeGenericMethod(); 

주? "청취자"를 만들고 인터페이스 기능을 트리거하려면 어떻게합니까?

다음은 학습 목적으로하는 매우 간단한 앱의 몇 가지 시도입니다. 페스에게있는 변수 mPresenterListener에 주목

class QuoteActivity : QuoteContract.ViewOps, AppCompatActivity() { 

    private lateinit var vText: TextView 
    private lateinit var vFab: FloatingActionButton 
    private lateinit var mPresenterListener: QuoteContract.PresenterOperations 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 
     mPresenterListener = this.mPresenterListener 
     vText=findViewById(R.id.main_quote) 
     vFab=findViewById(R.id.main_fab) 
     vFab.setOnClickListener{ 
      mPresenterListener.onQuoteRequested() 
     } 
    } 

    override fun displayQuote(quote: String) { 
     vText.text = quote 
    } 

} 

그리고 내 발표자 :

class QuotePresenter(private val viewListener: QuoteContract.ViewOps): QuoteContract.PresenterOperations { 

    private lateinit var modelListener: QuoteContract.ModelOperations 

    init { 
     modelListener = this.modelListener 
    } 


    override fun onQuoteRequested() { 
     modelListener.generateQuote() 
    } 

    override fun onQuoteGenerated(quote: String) { 
     viewListener.displayQuote(quote) 
    } 


} 

인터페이스 :

interface QuoteContract { 



//Methods available to Presenter (Presenter -> View) 
interface ViewOps{ 
    fun displayQuote(quote: String) 
} 


//Ops offered from presenter to view (Presenter->View) 

interface PresenterOperations { 
    //Presenter->View 
    fun onQuoteRequested() 
    //Presenter->Model 
    fun onQuoteGenerated(quote: String) 
} 

//Ops offered from Model to Presenter (Model -> Presenter) 
interface ModelOperations { 
    fun generateQuote() 
} 

}

+0

이것은 인터페이스 나 리스너와 관련이 있습니까? 아니면 일반적으로 객체를 만드는 방법을 묻고 있습니까? – chris

+0

'setOnClickListener' 내부에 인터페이스를 구현하고 있습니다.'new View.OnClickListener' –

+1

'mPresenterListener = this.mPresenterListener'와'modelListener = this.modelListener'가 필요하기 때문입니다. 왜 사용 자체가 변수를 할당합니까? – Joshua

답변

1

당신이 좋아하는 관찰자/청취자를 할 수 this :

,
val textView: TextView = this.findViewById(R.id.amountEdit) 
val watcher = object : TextWatcher { 
    override fun afterTextChanged(p0: Editable?) { 
     val inputAmount = textView.text.toString 
     val amount = if (!inputAmount.isEmpty()) inputAmount.toDouble() else 0.0 
     conversionViewModel?.convert(amount) 
     } 

    override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { 
     println("before text changed called..") 
    } 

    override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { 
     println("text changed..") 
    } 
} 

다음 :

textView.addTextChangedListener(watcher) 

공지 감시자 선언의 객체입니다. 청취자와 똑같이 할 수 있습니다.

+1

좋아, 그냥 내 머리를 랩핑하기 만하면됩니다. Textwatcher는 인터페이스이고 싱글 톤에 할당하고 있습니까? 일반적인 MVP 시나리오에서 어떻게 작동합니까? 답변 해 주셔서 감사합니다 –

+0

왜 싱글 톤입니까? 그것은 하나의 예입니다. 이것은 Kotlin에 관한 많은 훌륭한 것들 중 하나입니다. 인스턴스를 객체로 만들 수 있습니다. – Rob

+1

내가 취한 미니 코스는 Kotlin의 Singleton을 하나의 인스턴스 만 가질 수있는 Object로 정의했습니다. 싱글 톤이 가끔씩 의존성 삽입에서 나타나는 것을 볼 수 있기 때문에 어휘 중복이 있는지 확실하지 않습니다. 어쨌든, 내 "대답"을 후속 주셔서 감사합니다. 귀하의 답변입니다, 난 그냥 모든 TextView shinnanigans와 길을 잃었 및 TextWatcher 인터페이스 또는 일부 안드로이드 라이브러리 클래스 경우 확실하지 않았다. 어쨌든, 당신은 나를 도왔고 그 질문에 대답했습니다 : 그것을 객체에 할당하십시오. 내 솔루션보다 훨씬 쉽습니다. 고마워요 –