我有一个似乎无法解决的错误。这是我的XML activity_main。这是第23行.com.example.caesar.library.ChipView我不知道问题是什么,因为可以找到库。该应用程序运行完美,但一旦它击中模拟器就会崩溃。
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:chip="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:text="@string/default_chip" />
<com.example.caesar.library.ChipView
android:id="@+id/text_chip_default"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginTop="20dp"
android:text="@string/attrs_chip" />
<com.example.caesar.library.ChipView
android:id="@+id/text_chip_attrs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
chip:chip_background="@color/deep_orange"
chip:chip_background_selected="@color/blue_grey"
chip:chip_corner_radius="6dp"
chip:chip_line_spacing="20dp"
chip:chip_padding="10dp"
chip:chip_side_padding="10dp"
chip:chip_spacing="16dp" />
<!-- chip:chip_background_res="@drawable/chip_selector" -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginTop="20dp"
android:text="@string/with_layout" />
<com.example.caesar.library.ChipView
android:id="@+id/text_chip_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add"
android:id="@+id/button"
android:layout_gravity="right"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginTop="20dp"
android:text="@string/with_override" />
<com.example.caesar.library.ChipView
android:id="@+id/text_chip_override"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
这是我的主要活动。 line setContentView(R.layout.activity_main);得到指点
public class MainActivity extends Activity implements OnChipClickListener {
Button addbtn;
EditText interestET;
String interest;
private ChipView mTextChipLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<Chip> mTagList1 = new ArrayList<>();
mTagList1.add(new Tag("Lorem"));
mTagList1.add(new Tag("Ipsum dolor"));
mTagList1.add(new Tag("Sit amet"));
mTagList1.add(new Tag("Consectetur"));
mTagList1.add(new Tag("adipiscing elit"));
List<Chip> mTagList2 = new ArrayList<>();
mTagList2.add(new Tag("Lorem", 1));
mTagList2.add(new Tag("Ipsum dolor", 2));
mTagList2.add(new Tag("Sit amet", 3));
mTagList2.add(new Tag("Consectetur", 4));
mTagList2.add(new Tag("adipiscing elit", 5));
// Adapter
ChipViewAdapter adapterLayout = new MainChipViewAdapter(this);
ChipViewAdapter adapterOverride = new MainChipViewAdapter(this);
// Default ChipTextView
ChipView mTextChipDefault = (ChipView) findViewById(R.id.text_chip_default);
interestET = (EditText) findViewById(R.id.editText);
addbtn = (Button) findViewById(R.id.button);
mTextChipDefault.setChipList(mTagList1);
// Attrs ChipTextView
ChipView mTextChipAttrs = (ChipView) findViewById(R.id.text_chip_attrs);
mTextChipAttrs.setChipList(mTagList1);
mTextChipAttrs.setOnChipClickListener(new OnChipClickListener() {
@Override
public void onChipClick(Chip chip) {
}
});
// Custom layout and background colors
mTextChipLayout = (ChipView) findViewById(R.id.text_chip_layout);
mTextChipLayout.setAdapter(adapterLayout);
mTextChipLayout.setChipLayoutRes(R.layout.chip_close);
mTextChipLayout.setChipBackgroundColor(getResources().getColor(R.color.light_green));
mTextChipLayout.setChipBackgroundColorSelected(getResources().getColor(R.color.green));
// mTextChipLayout.setChipList(mTagList1);
mTextChipLayout.setOnChipClickListener(this);
// Chip override
ChipView mTextChipOverride = (ChipView) findViewById(R.id.text_chip_override);
mTextChipOverride.setAdapter(adapterOverride);
mTextChipOverride.setChipList(mTagList2);
addbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
interest = interestET.getText().toString().trim();
mTextChipLayout.add(new Tag(interest));
interestET.setText("");
}
});
}
@Override
public void onChipClick(Chip chip)
{
mTextChipLayout.remove(chip);
}
}
这是logcat
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.caesar.myapplication/com.example.caesar.myapplication.MainActivity}: android.view.InflateException: Binary XML file line #23: Error inflating class com.example.caesar.library.ChipView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
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:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: android.view.InflateException: Binary XML file line #23: Error inflating class com.example.caesar.library.ChipView
at android.view.LayoutInflater.createView(LayoutInflater.java:633)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378)
at android.app.Activity.setContentView(Activity.java:2145)
at com.example.caesar.myapplication.MainActivity.onCreate(MainActivity.java:28)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
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:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378)
at android.app.Activity.setContentView(Activity.java:2145)
at com.example.caesar.myapplication.MainActivity.onCreate(MainActivity.java:28)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
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:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f0b0000
at android.content.res.Resources.getValue(Resources.java:1266)
at android.content.res.Resources.getColor(Resources.java:920)
at com.example.caesar.library.ChipViewAdapter.getColor(ChipViewAdapter.java:253)
at com.example.caesar.library.ChipViewAdapter.init(ChipViewAdapter.java:102)
at com.example.caesar.library.ChipViewAdapter.setAttributeSet(ChipViewAdapter.java:266)
at com.example.caesar.library.ChipViewAdapter.<init>(ChipViewAdapter.java:93)
at com.example.caesar.library.ChipView$1.<init>(ChipView.java:46)
at com.example.caesar.library.ChipView.init(ChipView.java:46)
at com.example.caesar.library.ChipView.<init>(ChipView.java:36)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378)
at android.app.Activity.setContentView(Activity.java:2145)
at com.example.caesar.myapplication.MainActivity.onCreate(MainActivity.java:28)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
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:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
这是ChipViewAdapter
public abstract class ChipViewAdapter extends Observable {
private Context mContext;
private AttributeSet mAttributeSet;
private int mChipSpacing;
private int mLineSpacing;
private int mChipPadding;
private int mChipCornerRadius;
private int mChipSidePadding;
private int mChipTextSize;
private int mChipRes;
private int mChipBackgroundColor;
private int mChipBackgroundColorSelected;
private int mChipBackgroundRes;
private boolean mHasBackground = true;
private boolean mToleratingDuplicate = false;
private LayoutInflater mInflater;
private List<Chip> mChipList;
/**
* Return the Chip layout res id
* Override it if you want to have different logic depending of Chip
*
* @return int
*/
public abstract int getLayoutRes(int position);
/**
* Return the Chip background res id
* Override it if you want to have different logic depending of Chip
*
* @return int
*/
public abstract int getBackgroundRes(int position);
/**
* Return the Chip background color
* Override it if you want to have different logic depending of Chip
*
* @return int
*/
public abstract int getBackgroundColor(int position);
/**
* Return the Chip color for selected state
* Override it if you want to have different logic depending of Chip
*
* @return int
*/
public abstract int getBackgroundColorSelected(int position);
/**
* Have a chance to modify the Chip layout
*/
public abstract void onLayout(View view, int position);
public ChipViewAdapter(Context context) {
this(context, null);
}
public ChipViewAdapter(Context context, AttributeSet attributeSet) {
mContext = context;
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mChipList = new ArrayList<>();
setAttributeSet(attributeSet);
}
private void init() {
mChipSpacing = mContext.getResources().getDimensionPixelSize(R.dimen.chip_spacing);
mLineSpacing = mContext.getResources().getDimensionPixelSize(R.dimen.chip_line_spacing);
mChipPadding = mContext.getResources().getDimensionPixelSize(R.dimen.chip_padding);
mChipSidePadding = mContext.getResources().getDimensionPixelSize(R.dimen.chip_side_padding);
mChipCornerRadius = mContext.getResources().getDimensionPixelSize(R.dimen.chip_corner_radius);
mChipBackgroundColor = getColor(R.color.chip_background);
mChipBackgroundColorSelected = getColor(R.color.chip_background_selected);
if (mAttributeSet != null) {
TypedArray typedArray = mContext.getTheme().obtainStyledAttributes(mAttributeSet, R.styleable.ChipView, 0, 0);
try {
mChipSpacing = (int) typedArray.getDimension(R.styleable.ChipView_chip_spacing, mChipSpacing);
mLineSpacing = (int) typedArray.getDimension(R.styleable.ChipView_chip_line_spacing, mLineSpacing);
mChipPadding = (int) typedArray.getDimension(R.styleable.ChipView_chip_padding, mChipPadding);
mChipSidePadding = (int) typedArray.getDimension(R.styleable.ChipView_chip_side_padding, mChipSidePadding);
mChipCornerRadius = (int) typedArray.getDimension(R.styleable.ChipView_chip_corner_radius, mChipCornerRadius);
mChipBackgroundColor = typedArray.getColor(R.styleable.ChipView_chip_background, mChipBackgroundColor);
mChipBackgroundColorSelected = typedArray.getColor(R.styleable.ChipView_chip_background_selected, mChipBackgroundColorSelected);
mChipBackgroundRes = typedArray.getResourceId(R.styleable.ChipView_chip_background_res, 0);
} finally {
typedArray.recycle();
}
}
}
public View getView(ViewGroup parent, int position) {
View view = null;
Chip chip = getChip(position);
if (chip != null) {
int chipLayoutRes = (getLayoutRes(position) != 0 ? getLayoutRes(position) : getChipLayoutRes());
Drawable chipBackground = generateBackgroundSelector(position);
if (chipLayoutRes == 0) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, 0, mChipSpacing, mLineSpacing);
view = new LinearLayout(mContext);
view.setLayoutParams(layoutParams);
((LinearLayout) view).setOrientation(LinearLayout.HORIZONTAL);
((LinearLayout) view).setGravity(Gravity.CENTER_VERTICAL);
view.setPadding(mChipSidePadding, mChipPadding, mChipSidePadding, mChipPadding);
TextView text = new TextView(mContext);
text.setId(android.R.id.text1);
((LinearLayout) view).addView(text);
} else {
view = mInflater.inflate(chipLayoutRes, parent, false);
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin, (layoutParams.rightMargin > 0 ? layoutParams.rightMargin : mChipSpacing), (layoutParams.bottomMargin > 0 ? layoutParams.bottomMargin : mLineSpacing));
}
if (view != null) {
TextView text = (TextView) view.findViewById(android.R.id.text1);
View content = view.findViewById(android.R.id.content);
if (text != null) {
text.setText(chip.getText());
text.setGravity(Gravity.CENTER);
if (mChipTextSize > 0)
text.setTextSize(TypedValue.COMPLEX_UNIT_SP, mChipTextSize);
}
if (mHasBackground) {
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
if (content != null)
content.setBackgroundDrawable(chipBackground);
else
view.setBackgroundDrawable(chipBackground);
} else {
if (content != null)
content.setBackground(chipBackground);
else
view.setBackground(chipBackground);
}
}
onLayout(view, position);
}
}
return view;
}
private Drawable generateBackgroundSelector(int position) {
if (getBackgroundRes(position) != 0)
return mContext.getResources().getDrawable(getBackgroundRes(position));
else if (mChipBackgroundRes != 0) {
return mContext.getResources().getDrawable(mChipBackgroundRes);
}
int backgroundColor = (getBackgroundColor(position) != 0 ? getBackgroundColor(position) : mChipBackgroundColor);
int backgroundColorSelected = (getBackgroundColorSelected(position) != 0 ? getBackgroundColorSelected(position) : mChipBackgroundColorSelected);
// Default state
GradientDrawable background = new GradientDrawable();
background.setShape(GradientDrawable.RECTANGLE);
background.setCornerRadius(mChipCornerRadius);
background.setColor(backgroundColor);
// Selected state
GradientDrawable selectedBackground = new GradientDrawable();
selectedBackground.setShape(GradientDrawable.RECTANGLE);
selectedBackground.setCornerRadius(mChipCornerRadius);
selectedBackground.setColor(backgroundColorSelected);
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, selectedBackground);
stateListDrawable.addState(new int[]{android.R.attr.state_focused}, selectedBackground);
stateListDrawable.addState(StateSet.WILD_CARD, background);
return stateListDrawable;
}
private void notifyUpdate() {
setChanged();
notifyObservers();
}
public Chip getChip(int position) {
return (position < count() ? mChipList.get(position) : null);
}
/**
* Wrapper to add a Chip
*
* @param chip
*/
public void add(Chip chip) {
if (!mChipList.contains(chip) || mToleratingDuplicate) {
mChipList.add(chip);
notifyUpdate();
}
}
/**
* Wrapper to remove a Chip
*
* @param chip
*/
public void remove(Chip chip) {
mChipList.remove(chip);
notifyUpdate();
}
/**
* How many Chip do we have
*
* @return int
*/
public int count() {
return mChipList.size();
}
protected int getColor(@ColorRes int colorRes) {
return mContext.getResources().getColor(colorRes);
}
public Context getContext() {
return mContext;
}
public AttributeSet getAttributeSet() {
return mAttributeSet;
}
public void setAttributeSet(AttributeSet attributeSet) {
mAttributeSet = attributeSet;
init();
}
public List<Chip> getChipList() {
return mChipList;
}
public void setChipList(List<Chip> chipList) {
mChipList = chipList;
notifyUpdate();
}
public boolean isToleratingDuplicate() {
return mToleratingDuplicate;
}
/**
* Set whether or not ChipTextView tolerate duplicate Chip
*
* @param toleratingDuplicate
*/
public void setToleratingDuplicate(boolean toleratingDuplicate) {
mToleratingDuplicate = toleratingDuplicate;
}
public boolean hasBackground() {
return mHasBackground;
}
public void setHasBackground(boolean hasBackground) {
mHasBackground = hasBackground;
}
public int getChipSpacing() {
return mChipSpacing;
}
public void setChipSpacing(int chipSpacing) {
mChipSpacing = chipSpacing;
}
public int getLineSpacing() {
return mLineSpacing;
}
public void setLineSpacing(int lineSpacing) {
mLineSpacing = lineSpacing;
}
public int getChipPadding() {
return mChipPadding;
}
public void setChipPadding(int chipPadding) {
mChipPadding = chipPadding;
}
public int getChipSidePadding() {
return mChipSidePadding;
}
public void setChipSidePadding(int chipSidePadding) {
mChipSidePadding = chipSidePadding;
}
public int getChipCornerRadius() {
return mChipCornerRadius;
}
public void setChipCornerRadius(int chipCornerRadius) {
mChipCornerRadius = chipCornerRadius;
}
public int getChipBackgroundColor() {
return mChipBackgroundColor;
}
public void setChipBackgroundColor(@ColorInt int chipBackgroundColor) {
mChipBackgroundColor = chipBackgroundColor;
}
public int getChipBackgroundColorSelected() {
return mChipBackgroundColorSelected;
}
public void setChipBackgroundColorSelected(@ColorInt int chipBackgroundColorSelected) {
mChipBackgroundColorSelected = chipBackgroundColorSelected;
}
public int getChipTextSize() {
return mChipTextSize;
}
public void setChipTextSize(int chipTextSize) {
mChipTextSize = chipTextSize;
}
/**
* Set overall Chip background color by res id
* Can be fine tuned by overriding @see com.scanners.android.bao.view.ChipTextView.Chip#getBackgroundRes
*
* @param backgroundRes
*/
public void setChipBackgroundRes(@DrawableRes int backgroundRes) {
mChipBackgroundRes = backgroundRes;
}
public int getChipLayoutRes() {
return mChipRes;
}
/**
* Set overall Chip layout by res id
* Can be fine tuned by overriding @see com.scanners.android.bao.view.ChipTextView.Chip#getLayoutRes
*/
public void setChipLayoutRes(@LayoutRes int chipRes) {
mChipRes = chipRes;
}
}
答案 0 :(得分:1)
com.example.caesar.library.ChipViewAdapter.getColor(ChipViewAdapter.java:253)
罪魁祸首就是这条线。仔细检查资源中的颜色。你通过Gradle导入库吗?或者只是复制粘贴一些没有资源的类?