2016-11-14 3 views
2

Мне нужен навигационный ящик во всех моих действиях. Так я использовал ящик BaseActivity for Navigation и расширил другие действия из базовой активности. Активность базы имеет ящики навигации. Dashboard деятельность расширяет базовую деятельность, но она вызывает исключение, когда я пытаюсь использовать нож для масла, чтобы связать взгляды говоря
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); 
    } 
} 
} 

деятельность_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" /> 

Почему рамка не была обнаружена в деятельности приборной панели?

ответ

0

Неправильно, я не тщательно проверял вопрос.

Отредактировано:

В вашем примере вы связали взгляды дважды. Один в BaseActivity и другой в DashBoardActivity.

  • Не нужно делать это в BaseActivity. Но убедитесь, что в подклассе есть панель инструментов с id 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 готов к использованию. Удостоверьтесь, что в вашем файле макета активности имеется файл frameelayout id dashboard_frameLayout.

+0

прочитал вопрос правильно. Это не о фрагментах. Это о framelayout, который присутствует в activity_dashboard.xml. Это значение равно null даже после привязки. –

+0

И ваш макет деятельности должен иметь панель инструментов и рамки, определенные внутри контейнера. Я не вижу в нем панель инструментов. – Nicholas

+0

, если я использую setContentView (R.layout.activity_dashboard) в подклассе. Он переопределит layout.I не получит навигационный ящик внутри этой activit.y –

0

В вашем случае «ButterKnife.bind (this)» (from onCreate() of BaseActivity) вызывается перед OnCreate() DashBoardActivity. Поэтому, когда ButterKnife пытается связать представления activity_base, он не может найти идентификатор вида R.id.dashboard_frameLayout в макете activity_base, который выдает исключение.

Чтобы привязать представление, следует добавить контейнер, такой как группа просмотра, например RelativeLayout, в Activity_base. Создайте метод addViews() в BaseActivity. Затем добавьте макет вида activity_dashboard в этот контейнер из onCreate() DashBoardActivity, вызвав addViews() из Baseactivity. Теперь вы можете добавить «ButterKnife.bind (this)» к методу addViews() (и вы не должны называть ButterKnife.bind где-нибудь еще в обоих действиях). Здесь следует обратить внимание на то, что вы должны получить ссылку на идентификатор представления контейнера в BaseActivity, просто используя findViewById, остальные представления получат привязку ButterKnife.

0

Я сделал что-то подобное в своем коде.

Моя цель состоит в том, чтобы иметь базовый ящик с одним ящиком, который я повторно использую в разных действиях, поэтому я хочу иметь возможность использовать макет во всех видах деятельности, но изменять контент, раздувая новые виды.

в моей базовую деятельности (которое является нав выдвижную деятельность) я это защищенного метод

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() выглядит следующим образом, где я отправить идентификатор макета Я хочу, чтобы раздуть до inflateContent()

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