-1

Привет, я использовал мастер студии Android для создания активности ящика. Внутри MainnActivity я поместил этот код:Фрагмент не загружается при щелчке по ящику с отгадкой

@Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.nav_movies) { 
      Fragment newDetail = ListFragment.newInstance(LAUNCH_MOVIES); 
      getSupportFragmentManager().beginTransaction() 
        .replace(R.id.container, newDetail) 
        .commit(); 

     } else if (id == R.id.nav_tv) { 
      Fragment newDetail = ListFragment.newInstance(LAUNCH_TV); 
      getSupportFragmentManager().beginTransaction() 
        .replace(R.id.container, newDetail) 
        .commit(); 
     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 

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

ListFragment:

public static ListFragment newInstance(int target) { 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SCOPE, target); 
     ListFragment fragment = new ListFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public ListFragment() { 
    } 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     scope = getArguments().getInt(ARG_SCOPE); 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.content_main, container, false); 

     switch (scope){ 
      case 1: 
       //launch Movies 
       ((TextView)rootView.findViewById(R.id.textView)).setText("" + MainActivity.LAUNCH_MOVIES); 
       break; 
      case 2: 
       //Launch tv 
       ((TextView)rootView.findViewById(R.id.textView)).setText("" + MainActivity.LAUNCH_TV); 
       break; 
      default: 
       Log.w(LOG_TAG, "INVALID SCOPE"); 
     } 

     return rootView; 
    } 

Спасибо Я схожу с ума.

XML файлы: activity_main

<android.support.v4.widget.DrawerLayout 
    ...> 

    <include 
     layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

    <android.support.design.widget.NavigationView 
     .../> 

</android.support.v4.widget.DrawerLayout> 

app_bar_main

<android.support.design.widget.CoordinatorLayout 
    ...> 

    <android.support.design.widget.AppBarLayout 
     ...> 

     <android.support.v7.widget.Toolbar 
      .../> 

    </android.support.design.widget.AppBarLayout> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/container"/> 

</android.support.design.widget.CoordinatorLayout> 

content_main

<RelativeLayout 
    ...> 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!"/> 
</RelativeLayout> 
+0

Мне очень хотелось бы знать, почему мой вопрос был опущен, и никаких решительных ответов не было добавлено. – Ddddddd

ответ

0

Вы пробовали Debuger? Вы можете видеть поток кода, используя точки останова.

+0

Я пробовал записывать все, и мне не повезло с отладчиком. Где вы предлагаете разместить контрольные точки? – Ddddddd

+0

Сначала вы можете попробовать использовать метод 'onNavigationItemSelected (ItemItem item), чтобы увидеть, как эти методы вызывают (в первой строке кода, а не mehod), а затем с помощью' F9' вы можете автоматически перейти к следующей выполненной строке. Обычно нужно называть точки останова, в которых вы ожидали, что код будет вызван. Edit: вы раздували мейню, чтобы прослушивать события кликов? –

+0

Что вы подразумеваете под инфляцией? Я создал работу с ящиком через Android Studio, поэтому, я думаю, все было позабочено. – Ddddddd

0

Я думаю, что если бы вы использовали отладчик Android Studio, проходящий по строкам, вы, скорее всего, найдете свою проблему. Мне все кажется прекрасным, но я не вижу весь код или XML. Что возвращает MainActivity.LAUNCH_TV и MainActivity.LAUNCH_MOVIES? Они могут ничего не возвращать и оставлять вас с пустым текстовым видом, и поэтому может показаться, что кнопки не работают. Другой проблемой может быть то, что R.id.nav_movies и R.id.nav_tv не правы, но я не могу сказать, что все ваши XML не включены. Установите отладчик, чтобы разбить первую строку onNavigationItemSelected и просто шагнуть по одной строке за раз, проблема должна быть легче решить, когда вы знаете, где она находится.

+0

MainActivity.LAUNCH_TV и _MOVIES - две целые константы. Один из них = 1, а другой = 2. Случай по умолчанию для коммутатора должен содержать журнал предупреждений, но этого не происходит, поэтому либо не выполняется вызов, либо весь фрагмент не создается. R.id.nav_movies и _tv в порядке, иначе я бы получил стек. – Ddddddd

+0

Вы уже пробовали отладчик? –

0

Похоже, что ваш navigationViewsetNavigationItemSelectedListener не называется. Установили ли вы слушателя на свой navigationView?

navigationView.setNavigationItemSelectedListener(listener); 
+0

Как я уже говорил, активность была создана заново через AS, и эта точная строка присутствует в MainActivity # onCreate. 'NavigationView navigationView = (NavigationView) findViewById (R.id.nav_view); navigationView.setNavigationItemSelectedListener (this); ' – Ddddddd

0

Я попробовал вашу проблему approach.The вы столкнулись, это заменить фрагмент id.You следует использовать RelativeLayout идентификатор из content_main.xml файла, при замене фрагмента

 FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction().replace(R.id.content_main, fragment).commit(); 

также удалить Framelayout из app_bar_main. xml-файл.

+0

Это приближается к решению: если я помещаю вместо макета кадра и делаю остальную часть того, что вы сказали, что это работает. Но затем я помещаю фрагмент в content_main.xml, и я раздуваю его с помощью Inflater. Если я попытаюсь загрузить еще один xml-файл в onCreateView, я снова вижу черный экран. – Ddddddd

0

Мне удалось заставить его работать. Очевидно, это была некоторая ошибка в том, как организованы XML-файлы. Код Java был оставлен как есть. Вместо этого в app_bar_main внутри макета координатора я поставил FrameLayout с идентификатором @+id/fragment_container. Также я удалил самогенерируемый тег <Include content_main.xml>.

В методе onNavigationItemSelected я обновил каждый .replace(), чтобы настроить новый FrameLayout следующим образом: .replace(R.id.fragment_container, newDetail).

Затем во фрагменте onCreateView я раздул новый макет, подобный этому: View rootView = inflater.inflate(R.layout.fragment_list, container, false);, где fragment_list - это макет, где у меня есть recycerView и все элементы интерфейса.

content_main.xml не использовался.

Я считаю, что ошибка была как-то связана с тегом <include> и беспорядочным сложным способом добавления ящика. 2/10 никогда не используйте ящик снова.

Смежные вопросы