2014-12-22 2 views
7

Я использую раствор и поток для питания своего приложения. Если у меня есть следующий вид:Рекомендуемый способ получения активности внутри экрана раствора?

public class MyView extends LinearLayout { 
    @Inject MyScreen.Presenter presenter; 
    private EditText someText; 

    public MyView(Context context) { 
    super(context); 
    Mortar.inject(context, this); 
    } 

    @Override protected void onFinishInflate() { 
    super.onFinishInflate(); 

    presenter.takeView(this); 
    } 

    @Override protected void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 
    presenter.dropView(this); 
    } 
} 

И следующий экран:

@Layout(R.layout.my_view) 
public class MyScreen implements Blueprint { 
    @Override public String getMortarScopeName() { 
    return getClass().getName(); 
    } 

    @Override public Object getDaggerModule() { 
    return new Module(); 
    } 

    @dagger.Module(injects = MyView.class, addsTo = MyActivity.Module.class) 
    public class Module { 
    } 

    @Singleton 
    public class Presenter extends ViewPresenter<MyView> { 
    private final SomeAsyncService service; 

    @Inject 
    Presenter() { } 

    @Override public void onLoad(Bundle savedInstanceState) { 
    } 

    @Override public void onSave(Bundle outState) { 
    } 

    } 
} 

Теперь я хотел бы получить доступ к деятельности, которая использует этот экран и View. Я хотел бы иметь доступ к некоторым из методов деятельности, как:

getWindow() 
finish() 
getLayoutInflater() 
getFragmentManager() 

etc 

Я попытался бросить контекст, как это в моем экране:

Activity activity = (Activity)getView.getContext; 

Но это, конечно, бросает следующее исключение:

java.lang.ClassCastException: mortar.MortarContextWrapper cannot be cast to 
android.app.Activity 

Как получить эту деятельность? Спасибо.

ответ

4

Не уверен, но Mortar не рекомендуется непосредственно использовать экземпляр активности?

This mortal sample полезно. Итак, я реализовал следующее.

class WindowOwner extends Presenter<WindowOwner.Activity> { 

    interface Activity { 
     void addFragsToWindow(int flags); 
    } 

    public static class Config() { 
     final private int flags; 
     Config(int flags) { this.flags = flags; } 
     public int getFlags() { return this.flags; } 
    } 

    private Config config; 

    public void setConfig(Config config) { 
     this.config = config; 
     update(); 
    } 

    private void update() { 
     WindowOwner.Activity activity = getView(); 
     if (activity != null) { 
       activity.addFlagsToWindow(config.getFlags()); 
     } 
    } 

    @dagger.Module(injects = {}, library = true) 
    public static class WindowOwnerModule { 
     @Provides 
     @Singleton 
     WindowOwner provideWindowOwnerPersenter() { return new WindowOwner(); } 
    } 
} 

Вы определяете WindowOwner.Module, и включают в себя этот классе модуль, как это.

@Module(injects = {}, library = true) 
public class AndroidModule { 

    // WindowOwner provider 
    @Provides 
    @Singleton 
    SystemBarOwner provideWindowOwnerPersenter() { 
     return new WindowOwner(); 
    } 
} 
@Module(
     includes = { 
      AndroidModule.class, // Includes your modules 
     }, 
     injects = { 
       MainApplication.class 
     }, 
     library = true 
) 
public final class MainModule { 

    private final MainApplication mApplication; 

    public MainModule(MainApplication application) { 
     mApplication = application; 
    } 

    @Provides 
    @Singleton 
    Application provideApplication() { 
     return mApplication; 
    } 
} 

И вы реализуете Activivty нравится следующим образом.

class AwesomeActivity extends Activity implements WindowOwner.Activity { 
     @Inject WindowOwner windowOwner; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      Mortar.inject(this, this); 
      this.windowOwner.takeView(this); 
     } 

     @Override 
     void addFragsToWindow(int flags) { 
      getWindow().addFlags(flags); 
     } 
} 

Вы можете использовать через WindowOwner

@Layout(R.layout.awesome_view) 
public class AwesomeScreen implements Blueprint { 

    @Override 
    public String getMortarScopeName() { 
     return getClass().getName(); 
    } 

    @Override 
    public Object getDaggerModule() { 
     return new Module(getViewState()); 
    } 

    @dagger.Module(
      injects = { 
        AwesomeView.class // inject your view 
      }, 
      addsTo = MainModule.class, 
      library = true 
    ) 
    public static class Module { 
    } 

    @Singleton 
    public static class Presenter extends ViewPresenter<AwesomeView> { 

     private final WindowOwner windowOwner; 

     @Inject 
     Presenter(WindowOwner windowOwner) { 
      this.windowOwner = systemBarOwner; 
     } 

     @Override 
     protected void onEnterScope(MortarScope scope) { 
      super.onEnterScope(scope); 

      // Update window flags via WindowOwner.Config 
      this.windowOwner.setConfig(new WindowOwner.Config(YOUR_FLAGS)); 
     } 
    } 
} 
+0

Спасибо, но я думаю, что этот пример не работает. Я пытаюсь заставить его работать последние два дня, но он не работает. Можете ли вы предоставить немного больше деталей? – user4386126

+1

@ user4386126 ОК, я добавил несколько источников. надеюсь, что это поможет. – eccyan

+0

Это так. Спасибо! – user4386126

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