2016-03-11 2 views
0

Привет, я пытаюсь открыть фрагмент при щелчке по элементу сетки, но он показывает ошибку java.lang.UnsupportedOperationException: addView (View) является не поддерживается в AdapterView. пожалуйста, помогите мне.java.lang.UnsupportedOperationException: addView (View) не поддерживается в AdapterView

осколочной экрана:

public class Screen extends Fragment { 

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.screen, container, false); 
     int[] text = {R.string.temp, R.string.weight, R.string.len, R.string.time, R.string.area, R.string.vol, R.string.store, R.string.prsure, R.string.sound, R.string.ene, R.string.mag, R.string.img}; 
     int[] imgId = {R.drawable.temperature, R.drawable.food, R.drawable.resize, R.drawable.circular, R.drawable.pie, R.drawable.chemistry, R.drawable.database, R.drawable.blood, R.drawable.sound, R.drawable.energy, R.drawable.magnet, R.drawable.images}; 

     GridView grid = (GridView) view.findViewById(R.id.grid); 
     Custom_Grid adapter = null; 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 
      adapter = new Custom_Grid(getContext(), text, imgId); 
     } 

     grid.setAdapter(adapter); 
     grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       Fragment fragment; 
       FragmentManager fm = getChildFragmentManager(); 
       switch (position) { 
        case 0: 
         fragment = new Temperature(); 
         fm.beginTransaction().replace(R.id.grid,fragment).commit(); 
         break; 
        case 1: 
         fragment = new Weight(); 
         fm.beginTransaction().replace(R.id.grid,fragment).commit(); 
         break; 
        case 2: 
         fragment = new Length(); 
         fm.beginTransaction().replace(R.id.grid,fragment).commit(); 
         break; 
        case 3: 
         fragment = new Time(); 
         fm.beginTransaction().replace(R.id.grid,fragment).commit(); 
         break; 
        case 4: 
         fragment = new Area(); 
         fm.beginTransaction().replace(R.id.grid,fragment).commit(); 
         break; 

    } 
      } 
     }); 
     return view; 
    } 
} 

CustomGrid:

public class Custom_Grid extends BaseAdapter 
{ 
    private Context mContext; 
    private final int[] text; 
    private final int[] Imageid; 

    public Custom_Grid(Context c, int[] text, int[] Imageid) { 
     mContext = c; 
     this.Imageid = Imageid; 
     this.text=text; 
    } 

    @Override 
    public int getCount() { 
     return text.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View grid; 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 

      grid = new View(mContext); 
      grid = inflater.inflate(R.layout.grid_single, null); 
      TextView textView = (TextView) grid.findViewById(R.id.grid_text); 
      ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image); 
      textView.setText(text[position]); 
      imageView.setImageResource(Imageid[position]); 
     } else { 
      grid = (View) convertView; 
     } 
     return grid; 
    } 
} 

mainactivity:

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 

    Fragment fragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 


     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

     Screen scr = new Screen(); 
     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.add(R.id.sun,scr); 
     ft.commit(); 

    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

LogCat:

FATAL EXCEPTION: main 
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime: Process: com.example.cherrypandu.uc, PID: 5117 
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime: java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView 
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime:  at android.widget.AdapterView.addView(AdapterView.java:469) 
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083) 
03-11 00:26:40.940 5117-5117/com.example.cherrypandu.uc E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
+0

вы заменяете макет сетки на другой фрагмент, заменить фрагмент GridLayout к другому фрагменту а не XML. –

+0

Я пробовал этот, но показывая другой тип ошибки – sun

+0

okay Позвольте мне проверить и поработать над этим. –

ответ

0

Вы пытаетесь выполнить команду setText() с ресурсом int id String вместо получения объекта String. Вы также не устанавливаете корректно View. Ваш адаптер должен выглядеть примерно так:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View grid; 
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 

     grid = inflater.inflate(R.layout.grid_single, parent, false); 
     TextView textView = (TextView) grid.findViewById(R.id.grid_text); 
     ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image); 
     textView.setText(mContext.getString(text[position])); 
     imageView.setImageResource(Imageid[position]); 
    } else { 
     grid = convertView; 
    } 
    return grid; 
} 

Кроме того, я настоятельно рекомендую вам использовать Patern из ViewHolder в вашем adaper. Вы можете прочитать об этом здесь: ViewHolder

0

Я просто даю вам подсказку, потому что вы не размещали все файлы xml здесь.

В вашем MainActivity XML добавить ниже макете кадра, на котором просмотреть фрагменты будут переключатель/добавлено:

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

добавить этот метод MainActivity.java для переключения framgent:

public void switchContentWithBackStack(Fragment fragment) { 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.container, 
         fragment).addToBackStack(null).commit(); 
    } 

addToBackStack (нуль) добавит текущий фрагмент к backstack.

получить экземпляр MainActivity на OnAttach() в FragmentScreen:

MainActivity mActivity; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     mActivity = (MainActivity) activity; 
    } 

    @Override 
    public void onAttach(Context activity) { 
     super.onAttach(activity); 
     mActivity = (MainActivity) activity; 
    } 

Для переключения Фрагмента вызова метода пропускания объекта фрагмента вы хотите показать:

mActivity.switchContentWithBackStack(mFragment); 

Если эта помощь то примите, если у вас есть вопросы, то дайте мне знать.

+0

где передать код mActivity.switchContentWithBackStack (mFragment); в случае с моим фрагментом экрана. – sun

+0

Да в корпусе выключателя –

+0

его не получается – sun

0

экрана Фрагмент:

Изменения в onItemClick из Gridview

public class Screen extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.screen, container, false); 
     int[] text = {R.string.temp, R.string.weight, R.string.len, R.string.time, R.string.area, R.string.vol, R.string.store, R.string.prsure, R.string.sound, R.string.ene, R.string.mag, R.string.img}; 
     int[] imgId = {R.drawable.temperature, R.drawable.food, R.drawable.resize, R.drawable.circular, R.drawable.pie, R.drawable.chemistry, R.drawable.database, R.drawable.blood, R.drawable.sound, R.drawable.energy, R.drawable.magnet, R.drawable.images}; 

     GridView grid = (GridView) view.findViewById(R.id.grid); 
     Custom_Grid adapter = null; 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 
      adapter = new Custom_Grid(getContext(), text, imgId); 
     } 

     grid.setAdapter(adapter); 
     grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       Fragment fragment; 
       FragmentManager fm = getActivity().getSupportFragmentManager(); 
       switch (position) { 
        case 0: 
         fragment = new Temperature(); 
         fm.beginTransaction().replace(R.id.sun,fragment).commit(); 
         break; 
        case 1: 
         fragment = new Weight(); 
         fm.beginTransaction().replace(R.id.sun,fragment).commit(); 
         break; 
        case 2: 
         fragment = new Length(); 
         fm.beginTransaction().replace(R.id.sun,fragment).commit(); 
         break; 
        case 3: 
         fragment = new Time(); 
         fm.beginTransaction().replace(R.id.sun,fragment).commit(); 
         break; 
        case 4: 
         fragment = new Area(); 
         fm.beginTransaction().replace(R.id.sun,fragment).commit(); 
         break; 

    } 
      } 
     }); 
     return view; 
    } 
} 
Смежные вопросы