2016-04-12 14 views
1

申し訳ありません私の質問が公表されても申し訳ありませんが、私は答えを見つけることができません。 rxjavaをライフサイクルにバインドするためにrxlifecycle-naviライブラリを使用したいので、NaviActivityクラスを拡張する必要があります。問題は、NaviActivityクラスがActivityに拡張されており、toolbarのためにAppCompatActivityを拡張する必要があるということです。ライブラリのソースコードを変更せずに、このエレガントな方法を実現するにはどうすればよいですか?私はAppCompatDelegate経由でそれを行うにはarticleを見つけましたが、十分に柔軟に見えません。私はそれが一般的な問題だと思う、私は2つのクラスを拡張できません。AppCompatActivityへのアクティビティの延長

public abstract class BaseActivity extends NaviActivity implements AppCompatCallback { 

private final ActivityLifecycleProvider provider = NaviLifecycle.createActivityLifecycleProvider(this); 

public AppCompatDelegate delegate; 

@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ButterKnife.bind(this); 
    delegate = AppCompatDelegate.create(this, this); 
    delegate.onCreate(savedInstanceState); 
} 

@Override 
public void onSupportActionModeStarted(ActionMode mode) { 

} 

@Override 
public void onSupportActionModeFinished(ActionMode mode) { 

} 

@Nullable 
@Override 
public ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback) { 
    return null; 
}} 

そして、別のクラス:現時点で

マイBaseActivity

public class CarWashesActivity extends BaseActivity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_car_washes); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    delegate.setSupportActionBar(toolbar); 
    delegate.getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      onBackPressed(); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
}} 

答えて

4

シンプルな解決方法は、をcom.trello.navi.componentパッケージに作成してください。

package com.trello.navi.component; 

import android.support.v7.app.AppCompatActivity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.os.PersistableBundle; 
import android.support.annotation.NonNull; 
import com.trello.navi.Event; 
import com.trello.navi.Listener; 
import com.trello.navi.NaviComponent; 
import com.trello.navi.internal.NaviEmitter; 

public class NaviAppCompatActivity extends AppCompatActivity implements NaviComponent { 

    private final NaviEmitter base = NaviEmitter.createActivityEmitter(); 

    @Override public boolean handlesEvents(Event... events) { 
    return base.handlesEvents(events); 
    } 

    @Override public <T> void addListener(Event<T> event, Listener<T> listener) { 
    base.addListener(event, listener); 
    } 

    @Override public <T> void removeListener(Listener<T> listener) { 
    base.removeListener(listener); 
    } 

    @Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    base.onCreate(savedInstanceState); 
    } 

    @Override public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { 
    super.onCreate(savedInstanceState, persistentState); 
    base.onCreate(savedInstanceState, persistentState); 
    } 

    @Override protected void onStart() { 
    super.onStart(); 
    base.onStart(); 
    } 

    @Override protected void onResume() { 
    super.onResume(); 
    base.onResume(); 
    } 

    @Override protected void onPause() { 
    base.onPause(); 
    super.onPause(); 
    } 

    @Override protected void onStop() { 
    base.onStop(); 
    super.onStop(); 
    } 

    @Override protected void onDestroy() { 
    base.onDestroy(); 
    super.onDestroy(); 
    } 

    @Override protected void onRestart() { 
    super.onRestart(); 
    base.onRestart(); 
    } 

    @Override protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    base.onSaveInstanceState(outState); 
    } 

    @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { 
    super.onSaveInstanceState(outState, outPersistentState); 
    base.onSaveInstanceState(outState, outPersistentState); 
    } 

    @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    base.onRestoreInstanceState(savedInstanceState); 
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) { 
    super.onRestoreInstanceState(savedInstanceState, persistentState); 
    base.onRestoreInstanceState(savedInstanceState, persistentState); 
    } 

    @Override protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    base.onNewIntent(intent); 
    } 

    @Override public void onBackPressed() { 
    super.onBackPressed(); 
    base.onBackPressed(); 
    } 

    @Override public void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    base.onAttachedToWindow(); 
    } 

    @Override public void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 
    base.onDetachedFromWindow(); 
    } 

    @Override public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    base.onConfigurationChanged(newConfig); 
    } 

    @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    base.onActivityResult(requestCode, resultCode, data); 
    } 

    @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
     @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    base.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

参考:https://github.com/trello/navi

+0

の "NaviAppCompatActivity" のための
検索それは良い解決策、THXですが、他がある場合、私は思っていました。 Bcsは柔軟ではありません2、ライブラリのソースコードが変更されるか、単にソースコードを見ることができない場合はどうなりますか? –

+1

うーん... 'trello/navi'ライブラリは既に' NaviAppCompatActivity'をサポートしています(https://github.com/trello/navi/blob/master/navi/src/main/java/)。 com/trello/navi/component/support/NaviAppCompatActivity.java)をライブラリ自体に追加します。あなたは私が行ったコピーをする必要はありません。 – EpicPandaForce

2

AppCompatActivityを拡張AppCompatNaviActivityを作成します。次に、NaviActivityで提供されているすべてのコードをAppCompatNaviActivityに追加します。

は今、あなたは、NaviActivityを拡張もNaviActivityAppCompatActivityのすべての素晴らしい機能を提供しますどのAppCompatNaviActivityを拡張する必要があるとき。

これは少しハックですが、これがあなたを助けることを願っています。

関連する問題