2016-11-14 92 views
2

我希望在所有活動中使用導航抽屜。因此,我使用了BaseActivity作爲導航抽屜並從基本活動中擴展了其他活動.Base活動具有導航抽屜。儀表盤活動延伸基地活動,但它會引發異常,當我嘗試使用butterknife綁定的觀點說
Android:在活動中使用ButterKnife從其他活動延伸

java.lang.IllegalStateException: Required view 'dashboard_frameLayout' with ID 2131558517 for field 'frameLayout' was not found. 

這裏有相關的文件
BaseActivity.java

public class BaseActivity extends AppCompatActivity { 

@BindView(R.id.toolbar) Toolbar toolbar; 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_base); 
    ButterKnife.bind(this); 

    //set toolbar and both Navigation Drawer 

} 

DashboardActivity.java

public class DashBoardActivity extends BaseActivity { 

@BindView(R.id.dashboard_frameLayout) 
FrameLayout frameLayout; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    View view = getLayoutInflater().inflate(R.layout.activity_dashboard,frameLayout); 
    ButterKnife.bind(this,view); 

    init(); 
} 

private void init() { 

    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dashboard_frameLayout); 
    if(fragment != null){ 
     Utils.getInstance().addFragment(this,new Fragment_Dashboard(),R.id.dashboard_frameLayout); 
    } 
} 
} 

activity_dashboard.xml

<FrameLayout 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/dashboard_frameLayout" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

爲什麼在儀表板活動中未找到framelayout?

回答

0

我錯了我沒有仔細檢查問題。

編輯:

在您的例子已經綁定的意見的兩倍。一個在BaseActivity中,另一個在DashBoardActivity中。

  • 不需要在BaseActivity中做到這一點。但請確保在子類活動中有一個工號爲R.id.toolbar的工具欄。
  • 沒有必要膨脹佈局R.layout.activity_dashboard,你已經在setContentView中完成了。它應該是這樣的:

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_dashboard); 
        ButterKnife.bind(this); 
    
        init(); 
    } 
    

你觸發ButterKnife.bind(本)之後,是的FrameLayout準備使用。確保framelayout id dashboard_frameLayout存在於您的活動佈局文件中。

+0

正確讀取的問題。它不是關於fragment.Its關於framelayout,它出現在activity_dashboard.xml中,即使在綁定視圖後也是null。 –

+0

和你的活動佈局應該有一個工具欄和一個容器內的FrameLayout定義。我沒有看到它的工具欄。 – Nicholas

+0

如果我使用的setContentView(R.layout.activity_dashboard)在subclass.It將覆蓋layout.I不會得到這個activit.y –

0

在你的情況 「ButterKnife.bind(本)」(從的onCreate(BaseActivity的))被DashBoardActivity的OnCreate中()之前調用。所以當ButterKnife嘗試綁定activity_base的視圖時,它無法在activity_base佈局中找到視圖ID R.id.dashboard_frameLayout,這會引發異常。

要綁定視圖,應該將一個容器(如RelativeLayout等視圖組)添加到activity_base中。在BaseActivity中創建一個addViews()方法。然後通過調用Baseactivity的addViews()將視圖activity_dashboard佈局添加到來自DashBoardActivity的onCreate()的容器中。現在,您可以將「ButterKnife.bind(this)」添加到addViews()方法(並且您不應該在兩個活動的其他任何地方調用ButterKnife.bind)。這裏有一點要注意,您必須只需通過使用findViewById,剩餘的觀點將受到ButterKnife得到結合得到BaseActivity容器的視圖id引用。

0

我確實在我的代碼類似的東西。

我的目標是有一個抽屜,我在不同的活動重用基地抽屜的活動,所以我希望能夠在所有活動中使用activity_base_drawer佈局,但通過虛報新的意見納入其更改的內容。

在我的基地活動

(這是一個導航抽屜活動)我有這樣的保護方法

protected void inflateContent(@LayoutRes int inflatedResID){ 
    setContentView(R.layout.activity_base_drawer); 

    LinearLayout contentContainer = ButterKnife.findById(this, R.id.content_container); 

    getLayoutInflater().inflate(inflatedResID, contentContainer); 
    ButterKnife.bind(this); 

    setSupportActionBar(toolbar); 

    setupNavDrawer(); 
} 

我送底座導航抽屜佈局setContentView()具有線性佈局是,我想向容器爲每個擴展我的基地活動的活動充氣新的佈局

如您所見,LinearLayout contentContainer正在使用findById而不是@BindView。我必須這樣做,這樣一來,因爲我需要充氣視圖到內容容器我打電話ButterKnife.bind(this);

之前查找內容容器的佈局後,我誇大使用getLayoutInflater().inflate(inflatedResID, contentContainer);

然後我打電話ButterKnife.bind(this);

視圖進去

最後,我這樣做,取決於正在在基本活動類使用@BindView約束佈局一些設置方法。

,並在任何擴展活動的onCreate()看起來是這樣的,我在那裏我想誇大佈局的ID發送給inflateContent()

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    inflateContent(R.layout.content_main); 
}