2016-04-12 111 views
1

對不起,如果我的問題是公佈的,但我不能(或不知道如何谷歌)找到答案。我想使用rxlifecycle-navi庫來將rxjava綁定到生命週期,所以我需要擴展NaviActivity類。問題是NaviActivity類延伸Activity,我需要延長 AppCompatActivity。如何在不嘗試更改庫的源代碼的情況下實現這種優雅?我發現article如何通過AppCompatDelegate做到這一點,但看起來不夠靈活。我想這是一個普遍的問題,我不能擴展2個類。將活動延伸到AppCompatActivity

BaseActivity的時刻:

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; 
}} 

而另一個類:

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包中創建您自己的NaviAppCompatActivity

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); 
    } 
} 

參考:
搜索 「NaviAppCompatActivity」 上https://github.com/trello/navi

+0

這是很好的解決方案,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

創建AppCompatNaviActivity延伸AppCompatActivity。然後將NaviActivity中提供的所有代碼添加到AppCompatNaviActivity

現在,無論何時您需要延長NaviActivity,延長AppCompatNaviActivity,這將提供AppCompatActivity以及NaviActivity的所有優秀功能。

它有點破解,但希望這會幫助你。

相關問題