-1

У меня есть фрагмент & у меня есть следующий код:NPE: Попытка вызвать метод интерфейса

NavDrawer listener; 
public interface NavDrawer { 
    void showNavDrawer(String msg); 
} 

Я установить навигационную иконку для своего фрагмента. Когда нажимается значок, я просто называю метод интерфейса.

toolbar.setNavigationIcon(android.R.drawable.ic_menu_directions); 
toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     listener.showNavDrawer("Show Drawer"); 
    } 
}); 

В MainActivity.class, я реализовал интерфейс, чтобы открыть панель навигации.

@Override 
public void showNavDrawer(String msg) { 
    drawer.openDrawer(GravityCompat.START); 
} 

Ошибка была показана:

java.lang.NullPointerException: Попытка вызова метода интерфейса

Перед тем, как опубликовать эту тему, я показал некоторые усилия, просмотрев и попыталась решение в существующем вопросе. Но пока не удалось решить.

+0

Не знаете, почему downvote? :( – user3289108

ответ

2

Override onAttach в вашем framgent

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    try { 
     listener= (NavDrawer) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement NavDrawer"); 
    } 
} 

А также проверить, если слушатель является нулем, прежде чем listener.showNavDrawer ("Show Ящика");

Примечание: onAttach (activity) устарел, у вас будет контекст, и вы можете использовать его. Вы можете проверить, является ли контекст примером активности.

Также выше было бы работать до тех пор, пока MainActivity реализует интерфейс.

http://developer.android.com/reference/android/app/Fragment.html#onAttach(android.app.Activity)

Подробнее fragmet связи @http://developer.android.com/training/basics/fragments/communicating.html

+1

это правильно, если 'Активность' внедряет' NavDrawer' – Blackbelt

+0

@Blackbelt spot на – Raghunandan

+0

Ничего себе, спасибо, человек. Это сработало. Просто нужно заменить контекст вместо Activity в onAttach(). – user3289108

0

Поскольку слушатель имеет нулевое значение, инициализировать его в MainActivity.

public class MainActivity extends AppCompatActivity implements NavDrawer{ 

    private NavDrawer listener; 

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

     ..... 

     listener= new NavDrawer(this); 

    } 

}