1

Я не могу получить свой простой фрагмент, чтобы отображать при выборе опции в моем навигационном ящике экран просто остается пустым. Ящик для навигации работает отлично, и я знаю, что метод selectItem() стреляет - ящик закрывается после выбора элемента, потому что drawerLayout.closeDrawer(listView); вызывается в конце метода selectItem().Android: проблемы с FragmentManager не заменяют FrameLayout

Вот соответствующий код из моего MainActivity

public class MainActivity extends ActionBarActivity implements 
     OnItemClickListener { 

@Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     // TODO Auto-generated method stub 
     selectItem(position); 

    } 

    public void selectItem(int position) { 
     Fragment fragment = null; 
     Bundle args = new Bundle(); 
     fragment = new BookStayFragment(); 
     args.putString("randomString", "testing this string"); 

     fragment.setArguments(args); 

     FragmentManager fragmentManager = getSupportFragmentManager(); 
     //This line doesn't seem to be replacing mainContent fragment in activity_main ? 
     fragmentManager.beginTransaction().replace(R.id.mainContent, fragment).commit(); 

     listView.setItemChecked(position, true); 
     setTitle(myAdapter.customerMainMenu[position]); 
     drawerLayout.closeDrawer(listView); 

    } 

activity_main.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawerLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

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

    <ListView 
     android:background="#3f51b5" 
     android:divider="@null" 
     android:id="@+id/drawerList" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="left" 
     > 
    </ListView> 

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

Простой фр agment класса Я пытаюсь поместить в @ + ид/MainContent

package com.example.hotelsystem; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class BookStayFragment extends Fragment{ 
    TextView tvTest; 

    public static final String ITEM_NAME = "Testing fragment loading from nav drawer"; 

    public BookStayFragment() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     View view = inflater.inflate(R.layout.book_stay_fragment, container, false); 
     tvTest = (TextView) view.findViewById(R.id.book_stay_text); 
     tvTest.setText(getArguments().getString(ITEM_NAME)); 

     return view; 
    } 
} 

, который использует этот XML-файл

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/book_stay_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="test" 
     /> 

</LinearLayout> 
+0

Если вы пытаетесь добавить BookStayFragment к макету в onCreate, это работает? – stkent

+0

@stkent фактически не работает, нет - поставьте те же самые строки в моей MainActivity onCreate() – user3324984

+0

Можете ли вы показать полный код активности, пожалуйста? – stkent

ответ

1

Bundles являются коллекцией ключевых/значение пара.
A ключ - это строка, используемая для идентификации значения , поэтому вы можете получить ее снова с Bundle.
В вашем случае ваше значение также является строкой. Я считаю, что в этой ситуации вы получаете свои ключи и значения путать.

Вот что вы сейчас делаете:

В вашем методе selectItem у вас есть:

args.putString("randomString", "testing this string"); 

Таким образом, вы помещаете строку, которая содержит «тестирует эту строку» в аргументы, и присвоение ему ключа «randomString».

Затем в Fragment классе вы устанавливаете текст для вашего TextView с:

tvTest.setText(getArguments().getString(ITEM_NAME)); 

Здесь ваши получают аргументы сверток, которые вы назначили Fragment и ищете строку, которая имеет ключITEM_NAME. Вы указали, что ITEM_NAME = "Testing fragment loading from nav drawer", но нет строки, назначенной для набора аргументов, с ключом «Тестирование загрузки фрагмента из навигационного ящика». Вместо этого вы должны искать строку с ключом «randomString».

+0

не должно быть одной или другой строковой нагрузки? У меня нет нити. Или ITEM_NAME в моем классе или тот, который я отправил в виде пакета с ключом randomString. – user3324984

+0

на самом деле попробовал это, и все работает отлично - довольно глупо в ретроспективе. Я думаю, я был старше, думая, что он пытается отправить строку, так или иначе, я могу lol. Благодаря! – user3324984

+0

Метод getString имеет две формы. Тот, который вы использовали, - 'getString (key)'. Другой - 'getString (key, defaultValue)'. Поэтому в вашем случае, если вы использовали 'getString (" randomString ", ITEM_NAME), он назначил бы« Тестирование загрузки фрагмента из навигационного ящика »в ваш« TextView », если он не сможет найти строку с ** ключом **« randomString ». –

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

  • Нет связанных вопросов^_^