【问题标题】:java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterViewjava.lang.UnsupportedOperationException:适配器视图不支持 addView(View)
【发布时间】:2020-03-30 09:30:34
【问题描述】:

您好,我试图在单击网格视图的项目时打开一个片段,但它显示错误 java.lang.UnsupportedOperationException: addView(View) is not supported in 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;
    }
}

自定义网格:

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;
    }
}

主要活动:

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;
    }

日志猫:

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)

【问题讨论】:

  • 您要将网格布局替换为另一个片段,请将 Gridlayout 片段替换为另一个片段而不是 xml。
  • 我试过了,但显示了另一种类型的错误
  • 好的,让我检查并处理它。
  • 然后它显示错误 java.lang.IllegalArgumentException: No view found for id 0x7f0d00bf 通过尝试。

标签: android android-fragments gridview


【解决方案1】:

您尝试使用String int id 资源执行setText(),而不是检索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;
}

此外,我强烈建议您在适配器中使用ViewHolder 的模式。你可以在这里阅读:ViewHolder

【讨论】:

    【解决方案2】:

    我只是给你一个提示,因为你没有在这里发布所有的 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(null) 将当前片段添加到 backstack。

    在 FragmentScreen 中的 OnAttach() 上获取 MainActivity 的实例:

     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);
    

    如果有帮助,请接受,如果您有疑问,请告诉我。

    【讨论】:

    • 把代码传到哪里 mActivity.switchContentWithBackStack(mFragment);在我的屏幕片段的切换情况下。
    • 你能解释一下你没有得到什么吗?
    【解决方案3】:

    屏幕碎片:

    Gridview的onItemClick变化

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 1970-01-01
      • 2013-09-14
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多