【问题标题】:How to show Snackbar message in activity?如何在活动中显示 Snackbar 消息?
【发布时间】:2016-08-23 05:30:55
【问题描述】:

我已经实现了一个名为 CSnackBar 的类,它包含 Snackbar 实现,我有一个名为“A”的活动,其中包含列表视图,并且它的适配器称为“A 适配器”我已经在适配器类中实现了点击事件......场景是像那样在单击列表视图项目时,我想检查 Internet 是否可用,如果是,则要导航到另一个活动,如果否,则要显示小吃店消息.....但是当我尝试显示小吃店消息时从适配器它给了我错误:-

SnackBar 类:-

 private static CSnackBar s_m_oCSnackBar;// declare snack bar variable

    public static CSnackBar getInstance() {// creating Instance of nack bar
        if (s_m_oCSnackBar == null) {
            s_m_oCSnackBar = new CSnackBar();
           }
        return s_m_oCSnackBar;
      }

    public void showSnackBarError(View v, String message, Context context) {
        // parametrised constructor

        Snackbar snack = Snackbar.make(v, "" + message, Snackbar.LENGTH_SHORT);
        View view = snack.getView();
        TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
        tv.setTextColor(Color.WHITE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
            tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
        else
            tv.setGravity(Gravity.CENTER_HORIZONTAL);
        ColoredSnackbar.alert(snack).show();
    }

    public void showSnackBarSuccess(View v, String message, Context context) {

        Snackbar snack = Snackbar.make(v, "" + message, Snackbar.LENGTH_SHORT);
        View view = snack.getView();
        TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
        tv.setTextColor(Color.WHITE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
            tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
        else
            tv.setGravity(Gravity.CENTER_HORIZONTAL);
        ColoredSnackbar.confirm(snack).show();
    }


Adapter class code for Onclick:-

    private final Context m_Context;// declaring context variable
    private final ArrayList<CDealAppDatastorage> s_oDataset;// declaring array list ariable

    public CDealAppListingAdapter(Context m_Context, ArrayList<CDealAppDatastorage> mDataList) {
        this.m_Context = m_Context;
        s_oDataset = mDataList;
    }

    @Override
    public int getCount() {// get total arraylist size
        return s_oDataset.size();
    }

    @Override
    public Object getItem(int position) {// get item position in array list
        return s_oDataset.get(position);
    }

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

    @SuppressLint({"SetTextI18n", "InflateParams"})
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.deallisting_card_view, null);
            viewHolder.m_Header = (TextView) convertView.findViewById(R.id.headingText);
            viewHolder.m_Subheader = (TextView) convertView.findViewById(R.id.subHeaderText);
            viewHolder.m_DummyText = (TextView) convertView.findViewById(R.id.subHeadingText);
            viewHolder.m_logoImage = (ImageView) convertView.findViewById(R.id.appImage);
            viewHolder.m_getBtn = (Button) convertView.findViewById(R.id.getDealBtn);
            convertView.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.m_getBtn.setOnClickListener(new View.OnClickListener() {// onclick getDeal Btn
            @Override
            public void onClick(View v) {//send to deal detail page onclick getDeal Btn
                if (NetworkUtil.isConnected(m_Context)){
                    Intent i = new Intent(v.getContext(), CDealAppListingDetails.class);
                    i.putExtra("DealCode", s_oDataset.get(position).getM_szsubHeaderText());// get deal code from deal data storage
                    i.putExtra("headerText", s_oDataset.get(position).getM_szHeaderText());// get deal name from deal dta storage
                    v.getContext().startActivity(i);
                }else {
                    /*here I am getting error*/CSnackBar.getInstance().showSnackBarError(v.findViewById(R.id.mainLayout),"No Internet connection available",m_Context);
                }

            }
        });
        CDealAppDatastorage m = s_oDataset.get(position);
        viewHolder.m_Header.setText(m.getM_szHeaderText());
        viewHolder.m_Subheader.setText(m.getM_szsubHeaderText());
        viewHolder.m_getBtn.setText("GET " + m.getM_szDealValue() + " POINTS");// set deal button text
        viewHolder.m_logoImage.setImageResource(m.getM_n_Image());// set deal logo

        String source = "Dummy text is text that is used in the publishing industry or by web designers to occupy space.";
        viewHolder.m_DummyText.setText(Html.fromHtml(source));

        return convertView;
    }

    private class ViewHolder {
        public TextView m_Header, m_Subheader, m_DummyText;
        public ImageView m_logoImage;
        public Button m_getBtn;
    }
}

这是日志错误:-

Process: com.example.devui1.rewardapp, PID: 11205
java.lang.NullPointerException
at android.support.design.widget.Snackbar.<init>(Snackbar.java:188)
at android.support.design.widget.Snackbar.make(Snackbar.java:220)
at com.example.devui1.rewardapp.snackbar.CSnackBar.showSnackBarError(CSnackBar.java:26)
at com.example.devui1.rewardapp.adapter.CDealAppListingAdapter$1.onClick(CDealAppListingAdapter.java:78)

【问题讨论】:

  • 也添加错误日志
  • 见上文............
  • 只在小吃店尝试v,而不是findViewById
  • findViewById(R.id.mainLayout) 是Activity类MainLayout的Id
  • snackbar 需要一个不一定是主布局的视图

标签: android


【解决方案1】:

这行是你的问题

/*here I am getting error*/CSnackBar.getInstance().showSnackBarError(v.findViewById(R.id.mainLayout),"No Internet connection available",m_Context);

变量v 代表您点击的ButtonButton 不是从 ViewGroup 派生的,因此它不能有任何孩子。因此findViewById 将返回null,您将其传递给SnackBarmake 函数。如果要传递主布局,则必须将该行更改为此

CSnackBar.getInstance().showSnackBarError(findViewById(R.id.mainLayout),"No Internet connection available",m_Context);

这将尝试在您由setContentView 设置的布局中查找ID 为mainLayoutView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 2022-01-06
    • 2016-11-01
    • 2020-09-24
    • 2017-11-23
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多