我无法在Android的CustomSnackbar上编写setAction代码
我有一个CustomSnackBar类和一个活动,我想在该活动中显示一个Snackbar。我有一个快餐店的自定义布局,但当我在CustomSnackBar中编写setAction代码时出现问题,错误是:我无法在Android的CustomSnackbar上编写setAction代码,android,android-snackbar,Android,Android Snackbar,我有一个CustomSnackBar类和一个活动,我想在该活动中显示一个Snackbar。我有一个快餐店的自定义布局,但当我在CustomSnackBar中编写setAction代码时出现问题,错误是: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.mohammaddvi.snappfood/com.test.mohammaddvi.snappfood.RestaurantDetails}:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.mohammaddvi.snappfood/com.test.mohammaddvi.snappfood.RestaurantDetails}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View com.test.mohammaddvi.snappfood.Model.CustomSnackBar.getContentView()' on a null object reference
而我的定制snackbar是:
package com.test.mohammaddvi.snappfood.Model;
import android.content.Context;
import android.content.Intent;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.TextView;
import com.test.mohammaddvi.snappfood.BuyBasket;
import com.test.mohammaddvi.snappfood.MainActivity;
@SuppressWarnings("SpellCheckingInspection")
public class CustomSnackBar {
private LayoutInflater layoutInflater;
private int layout;
private int background;
private View contentView;
private LENGTH duration;
private boolean swipe;
private Snackbar snackbar;
private Snackbar.SnackbarLayout snackbarView;
private CustomSnackBar(Context context) {
this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.duration = LENGTH.LONG;
this.background = -1;
this.layout = -1;
this.swipe = true;
}
public static CustomSnackBar Builder(Context context) {
return new CustomSnackBar(context);
}
public CustomSnackBar layout(int layout) {
this.layout = layout;
return this;
}
public CustomSnackBar background(int background) {
this.background = background;
return this;
}
public CustomSnackBar duration(LENGTH duration) {
this.duration = duration;
return this;
}
public CustomSnackBar swipe(boolean swipe) {
this.swipe = swipe;
return this;
}
public CustomSnackBar build(View view) {
if (view == null) throw new CustomSnackbarException("view can not be null");
if (layout == -1) throw new CustomSnackbarException("layout must be setted");
switch (duration) {
case INDEFINITE:
snackbar = Snackbar.make(view, "", Snackbar.LENGTH_INDEFINITE);
break;
case SHORT:
snackbar = Snackbar.make(view, "", Snackbar.LENGTH_SHORT);
break;
case LONG:
snackbar = Snackbar.make(view, "", Snackbar.LENGTH_LONG);
break;
}
snackbarView = (Snackbar.SnackbarLayout) snackbar.getView();
if (!swipe) {
snackbarView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
snackbarView.getViewTreeObserver().removeOnPreDrawListener(this);
((CoordinatorLayout.LayoutParams) snackbarView.getLayoutParams()).setBehavior(null);
return true;
}
});
}
snackbarView.setPadding(0, 0, 0, 0);
if (background != -1) snackbarView.setBackgroundResource(background);
contentView = layoutInflater.inflate(layout, null);
snackbarView.addView(contentView, 0);
return this;
}
public void show() {
snackbar.show();
}
public boolean isShowing() {
return snackbar != null && snackbar.isShown();
}
public void dismiss() {
if (snackbar != null) snackbar.dismiss();
}
public View getContentView() {
return contentView;
}
public enum LENGTH {
INDEFINITE, SHORT, LONG
}
public class CustomSnackbarException extends RuntimeException {
public CustomSnackbarException(String detailMessage) {
super(detailMessage);
}
}
public void setAction(View v,CharSequence ch, int x){
snackbar = Snackbar.make(v,ch,x).setAction("", new View.OnClickListener() {
@Override
public void onClick(View v) {
v.getContext().startActivity(new Intent(v.getContext(),MainActivity.class));
}
});
}
}
我的活动是:
package com.test.mohammaddvi.snappfood;
public class RestaurantDetails extends AppCompatActivity implements MenuFragment.MenuFragmentListener {
private final static String TAG = RestaurantDetails.class.getName();
private ViewPager mViewPager;
private CustomSnackBar snackbar;
private Context context;
private android.support.v7.widget.Toolbar toolbar;
private CoordinatorLayout coordinatorLayout;
private TextView totalnumber;
private LayoutInflater layoutInflater;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_restaurant_details);
mViewPager = (ViewPager) findViewById(R.id.viewpager);
coordinatorLayout = findViewById(R.id.coordinatorlayout);
TabLayout tabLayout = findViewById(R.id.tabs);
toolbar = findViewById(R.id.toolbar);
snackbar = new CustomSnackBar(this);
setupViewPager(mViewPager);
tabLayout.setupWithViewPager(mViewPager);
snackbar=CustomSnackBar.Builder(RestaurantDetails.this)
.layout(R.layout.snackview)
.background(R.color.colorPrimary)
.duration(CustomSnackBar.LENGTH.LONG)
.swipe(true)
.build(coordinatorLayout)
.setAction();
totalnumber = snackbar.getContentView().findViewById(R.id.totalnumber);
}
private void setupViewPager(ViewPager viewPager) {
FragmentsAdapter adapter = new FragmentsAdapter(getSupportFragmentManager());
adapter.addFragment(new CommentFragment(), "نظرات");
adapter.addFragment(new InfoFragment(), "اطلاعات");
adapter.addFragment(new MenuFragment(), "منو");
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(2); // this code for save screen info for 2 pages except the screen page
viewPager.setCurrentItem(2); // this code is for setting first view of view pager
}
@Override
public void onMenuFragmentCount(int count) {
totalnumber.setText(count + "");
snackbar.show();
}
@Override
public void oMenuFragmentDismiss() {
snackbar.dismiss();
}
}
如果你认为你需要什么来回答我,告诉我把它放好。
我更改设置操作:
public CustomSnackBar setAction() {
snackbar.setAction("", new View.OnClickListener() {
@Override
public void onClick(View v) {
v.getContext().startActivity(new Intent(v.getContext(), BuyBasket.class));
}
});
return this;
}
我的日志是:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.test.mohammaddvi.snappfood, PID: 14112
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.mohammaddvi.snappfood/com.test.mohammaddvi.snappfood.RestaurantDetails}: java.lang.ClassCastException: android.widget.FrameLayout cannot be cast to android.support.design.internal.SnackbarContentLayout
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5349)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
Caused by: java.lang.ClassCastException: android.widget.FrameLayout cannot be cast to android.support.design.internal.SnackbarContentLayout
at android.support.design.widget.Snackbar.setAction(Snackbar.java:243)
at com.test.mohammaddvi.snappfood.Model.CustomSnackBar.setAction(CustomSnackBar.java:62)
at com.test.mohammaddvi.snappfood.RestaurantDetails.onCreate(RestaurantDetails.java:49)
at android.app.Activity.performCreate(Activity.java:6020)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2284)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5349)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
这是我的snackbar布局:
and this is my snackbarlayout:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="bottom"
android:background="@color/colorPrimary">
<ImageView
android:id="@+id/buybasket"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="right|center_vertical"
android:layout_marginRight="100dp"
android:src="@drawable/basket" />
<TextView
android:id="@+id/buybaskettext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fontFamily="@font/iranyekanregular"
android:text=" مشاهده سبد خرید"
android:textColor="#ffffff"
android:textSize="18sp" />
<TextView
android:id="@+id/totalnumber"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical|left"
android:layout_marginStart="50dp"
android:fontFamily="@font/iranyekanregular"
android:gravity="center"
android:text="0"
android:textColor="#ffffff"
android:textSize="18sp" />
这是我的snackbar布局:
您在这一行中得到了
nullpointerException
totalnumber = snackbar.getContentView().findViewById(R.id.totalnumber);
因为您没有初始化snackbar
snackbar = new CustomSnackBar(this);
totalnumber = snackbar.getContentView().findViewById(R.id.totalnumber);
希望这对你有帮助 更改此代码
snackbar = CustomSnackBar.Builder(RestaurantDetails.this)
.layout(R.layout.snackview)
.background(R.color.colorPrimary)
.duration(CustomSnackBar.LENGTH.LONG)
.swipe(true)
.build(coordinatorLayout)
.setAction(coordinatorLayout,"",20);
我终于用这些代码解决了我的问题,并删除了CustomSnackBar类:
flater inflater = LayoutInflater.from(RestaurantDetails.this);
View snackview = inflater.inflate(R.layout.snackview, null);
TextView textView1 = snackview.findViewById(R.id.buybaskettext);
snackbar = Snackbar.make(coordinatorLayout, "", Snackbar.LENGTH_LONG).setAction("qqqqq", new View.OnClickListener() {
@Override
public void onClick(View v) {
RestaurantDetails.this.startActivity(new Intent(RestaurantDetails.this, BuyBasket.class));
}
});
Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();
TextView textView = (TextView) layout.findViewById(android.support.design.R.id.snackbar_text);
textView.setVisibility(View.INVISIBLE);
ImageView imageView = snackview.findViewById(R.id.buybasket);
layout.setPadding(0, 0, 0, 0);
layout.addView(snackview, 0);
如何更改?错误说明您没有初始化snackbar,因此请在初始化snackbar后重试错误应修复如果没有,请检查日志我确信您的代码中存在另一个错误否,但我认为我的错误来自CustomSnackBar中的setAction方法您可以调查吗?我更改setAction:public CustomSnackBar setAction(){snackbar.setAction(“,new View.OnClickListener(){@Override public void onClick(View v){v.getContext().startActivity(new Intent(v.getContext(),buybarket.class));}});返回此;}当我想要设置操作时,我抛出了异常错误,我不知道为什么