2017-04-11 2 views
0

Ich versuche MVVM für Android. Ich habe eine Schaltfläche, die eine andere Aktivität onClick öffnet. Codes unter:MVVM Activity Intent für Android

Ausblick:

<LinearLayout 
      android:id="@+id/activity_test" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      tools:context=".mvvm.view.TestActivity"> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Activity" 
      android:onClick="@{viewModel.onClickButton1}"/> 

    </LinearLayout> 

Ansichtsmodell:

public View.OnClickListener onClickButton1() { 
    return view -> { 
     mContext.startActivity(new Intent(mContext, MockActivity.class)); 
    }; 
} 

Dies scheint nicht für mich zu arbeiten. Wenn ich auf die Schaltfläche klicke, wird MockActivity nicht gestartet. Was könnte das Problem sein?

Antwort

2

in Ihrer View-Datei hat Sie binden Ihre Ansicht an Ihr Viewmodel?

binding.setViewModel (viewModel);

+0

Accepted. Ich mussteViewModel in meiner Ansicht Aktivität setzen. Darüber hinaus musste ich meiner Absicht Flag hinzufügen: intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); – andychen

0

Versuchen Ansichtsmodell :: onClickButton1 statt viewModel.onClickButton1

+0

Dies macht keinen Unterschied .. Es gibt nur eine Warnung, wenn Sie '.' Anstatt von '::'.. '.' ist veraltet, aber im Moment werden beide akzeptiert. – Rachit

0

Der Code in Ihrer VM Klasse

public void onMyButtonClicked(View view) { 
    // YOUR CODE HERE 
} 

werden soll, und in der xml:

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:onClick="@{offlineDownloadsVM::onMyButtonClicked}"/> 
+0

Akzeptiert. Dies ist der korrekte Code im ViewModel – andychen

0

Als Vorschlag ist es besser, keine Ereignis-Listener in Ihr ViewModel einzubeziehen, sondern diese stattdessen in die Ansicht (Aktivität oder Fragment hier) einzufügen. Dann können Sie die Methoden des Ansichtsmodells aufrufen, um die Arbeit zu erledigen. Die Idee ist, ViewModel sollte keinen Verweis darauf haben, Klassen überhaupt zu sehen, aber in Ihrem Code geben Sie eine Ansicht an die Methode onClickButton1 weiter.