我搜索了这个错误,但没有一个可以帮助我。我应该可以通过在适配器中设置 itemCount 来创建列表视图中的项目,但在适配器中膨胀布局时会出现此错误。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.digitronic.SmsController, PID: 25805
android.view.InflateException: Binary XML file line #37: Binary XML file line #37: Error inflating class <unknown>
Caused by: android.view.InflateException: Binary XML file line #37: Error inflating class <unknown>
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
at android.view.LayoutInflater.createView(LayoutInflater.java:652)
at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:724)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:792)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:734)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:865)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:828)
at android.view.LayoutInflater.inflate(LayoutInflater.java:525)
at android.view.LayoutInflater.inflate(LayoutInflater.java:427)
at android.view.LayoutInflater.inflate(LayoutInflater.java:378)
at com.digitronic.smscontroller.View.RelaysListAdapter.getView(RelaysListAdapter.java:90)
at android.widget.AbsListView.obtainView(AbsListView.java:3229)
at android.widget.ListView.makeAndAddView(ListView.java:2147)
at android.widget.ListView.fillDown(ListView.java:767)
at android.widget.ListView.fillFromTop(ListView.java:833)
at android.widget.ListView.layoutChildren(ListView.java:1900)
at android.widget.AbsListView.onLayout(AbsListView.java:2999)
at android.view.View.layout(View.java:18799)
at android.view.ViewGroup.layout(ViewGroup.java:5952)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:18799)
at android.view.ViewGroup.layout(ViewGroup.java:5952)
at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1626)
at android.view.View.layout(View.java:18799)
at android.view.ViewGroup.layout(ViewGroup.java:5952)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:18799)
at android.view.ViewGroup.layout(ViewGroup.java:5952)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:18799)
at android.view.ViewGroup.layout(ViewGroup.java:5952)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:18799)
at android.view.ViewGroup.layout(ViewGroup.java:5952)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:18799)
at android.view.ViewGroup.layout(ViewGroup.java:5952)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:18799)
at android.view.ViewGroup.layout(ViewGroup.java:5952)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:822)
at android.view.View.layout(View.java:18799)
at android.view.ViewGroup.layout(ViewGroup.java:5952)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2634)
这是我放入列表视图的片段:
package com.digitronic.smscontroller.View;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import com.digitronic.smscontroller.R;
import com.digitronic.smscontroller.View.Interface.IControllerActivity;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* Created by Ali Gadimi on 11/5/2017.
*/
public class RelaysFragment extends Fragment {
@InjectView(R.id.inputs_lv)ListView inputsLv;
private View mainView;
private IControllerActivity activity;
private RelaysListAdapter listAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mainView = inflater.inflate(R.layout.relays_tab, container, false);
ButterKnife.inject(this, mainView);
return mainView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
activity.relaysFragmentLoaded();
}
public void setParent(IControllerActivity activity)
{
this.activity = activity;
}
public void addViews(int viewCount)
{
listAdapter = new RelaysListAdapter(getActivity().getApplicationContext());
listAdapter.setItemCount(viewCount);
inputsLv.setAdapter(listAdapter);
}
}
这是relays_tab.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/third_gray">
<ListView
android:id="@+id/inputs_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null" /></LinearLayout>
我的列表视图适配器:
package com.digitronic.smscontroller.View;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.digitronic.smscontroller.R;
import java.util.ArrayList;
/**
* Created by Ali Gadimi on 11/7/2017.
*/
public class RelaysListAdapter extends BaseAdapter {
private int itemCount = 0;
private Context context;
private ArrayList<RelaysItem> items;
private LayoutInflater inflater;
public RelaysListAdapter(Context c)
{
this.context = c;
inflater = LayoutInflater.from(c);
}
public void setItems()
{
}
public void setItemCount(int count)
{
this.itemCount = count;
}
public void updateViewIcon(int position, int iconResource)
{
items.get(position).icon = iconResource;
notifyDataSetChanged();
}
public void updateViewName(int position, String name)
{
items.get(position).name = name;
notifyDataSetChanged();
}
public void updateViewTimer(int position, int timerValue)
{
items.get(position).time = timerValue;
notifyDataSetChanged();
}
public void updateViewOnOff(int position, int inputState)
{
items.get(position).inputState = inputState;
notifyDataSetChanged();
}
@Override
public int getCount() {
return itemCount;
}
@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) {
ViewHolder holder;
if (convertView == null)
{
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.relay_item, null);
holder.iconIv = (ImageView) convertView.findViewById(R.id.icon_iv);
holder.nameTv = (TextView) convertView.findViewById(R.id.name_tv);
holder.timerIb = (ImageButton) convertView.findViewById(R.id.timer_ib);
holder.onBtn = (Button) convertView.findViewById(R.id.on_btn);
holder.offBtn = (Button) convertView.findViewById(R.id.off_btn);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
RelaysItem item;
if(items.size() == itemCount)
item = items.get(position);
else
item = new RelaysItem();
holder.iconIv.setImageResource(item.icon);
holder.nameTv.setText(item.name.equals("") ? "Relay " + (position+1): item.name);
setupTimerIb(holder.timerIb, position, item.time);
setupOnOffBtn(holder.onBtn, holder.offBtn, position, item.inputState);
return convertView;
}
private void setupTimerIb(ImageButton timerIb, int position, int timerValue)
{
if (timerValue > 0)
timerIb.setImageResource(R.drawable.timer_set);
else
timerIb.setImageResource(R.drawable.timer_unset);
timerIb.setOnClickListener(new TimerIbOnClickListener(position));
}
private void setupOnOffBtn(Button onBtn, Button offBtn, int position, int inputState)
{
if (inputState == 0)
{
onBtn.setTextColor(context.getResources().getColor(R.color.gray));
((FrameLayout) onBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.third_gray));
offBtn.setTextColor(context.getResources().getColor(R.color.secondary_white));
((FrameLayout) offBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.off_state));
}
else if(inputState == 1)
{
onBtn.setTextColor(context.getResources().getColor(R.color.secondary_white));
((FrameLayout) onBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.on_state));
offBtn.setTextColor(context.getResources().getColor(R.color.gray));
((FrameLayout) offBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.third_gray));
}
else if(inputState == -1)
{
onBtn.setTextColor(context.getResources().getColor(R.color.gray));
((FrameLayout) onBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.third_gray));
offBtn.setTextColor(context.getResources().getColor(R.color.gray));
((FrameLayout) offBtn.getParent()).setBackgroundColor(context.getResources().getColor(R.color.third_gray));
}
onBtn.setOnClickListener(new OnBtnOnClickListener(position));
offBtn.setOnClickListener(new OffBtnOnClickListener(position));
}
private class TimerIbOnClickListener implements View.OnClickListener {
private int position;
TimerIbOnClickListener(int position){
this.position = position;
}
@Override
public void onClick(View v) {
Toast.makeText(context, "Timer button click in position " + position, Toast.LENGTH_SHORT).show();
}
}
private class OnBtnOnClickListener implements View.OnClickListener {
private int position;
OnBtnOnClickListener(int position){
this.position = position;
}
@Override
public void onClick(View v) {
Toast.makeText(context, "On button click in position " + position, Toast.LENGTH_SHORT).show();
}
}
private class OffBtnOnClickListener implements View.OnClickListener {
private int position;
OffBtnOnClickListener(int position){
this.position = position;
}
@Override
public void onClick(View v) {
Toast.makeText(context, "Off button click in position " + position, Toast.LENGTH_SHORT).show();
}
}
private class ViewHolder{
ImageView iconIv;
TextView nameTv;
ImageButton timerIb;
Button onBtn;
Button offBtn;
}
}
列表视图项布局relay_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:background="@color/white"
android:elevation="1dp">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
android:id="@+id/icon_iv" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/gray"
android:textSize="18sp"
app:layout_constraintLeft_toRightOf="@+id/icon_iv"
android:layout_marginLeft="8dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
android:id="@+id/name_tv" />
<ImageButton
android:id="@+id/timer_ib"
android:layout_width="20dp"
android:layout_height="20dp"
android:scaleType="centerInside"
android:src="@drawable/timer_unset"
android:background="?attr/selectableItemBackground"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
app:layout_constraintRight_toLeftOf="@+id/linearLayout"
android:layout_marginRight="16dp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
android:id="@+id/linearLayout">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/third_gray">
<Button
android:id="@+id/on_btn"
android:layout_width="50dp"
android:layout_height="50dp"
android:text="@string/on"
android:textColor="@color/gray"
android:textAllCaps="false"
android:background="?attr/selectableItemBackground"/>
</FrameLayout>
<View
android:layout_width="2dp"
android:layout_height="50dp"
android:background="@color/gray"/>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/third_gray">
<Button
android:id="@+id/off_btn"
android:layout_width="50dp"
android:layout_height="50dp"
android:text="@string/off"
android:textColor="@color/gray"
android:textAllCaps="false"
android:background="?attr/selectableItemBackground"/>
</FrameLayout>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
我写这篇文章只是因为这里有一个错误,说它主要是在这个问题中编写的代码,并要求我添加更多细节,但我认为我已经说得足够多:D
以这种方式膨胀布局:
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
convertView = inflater.inflate(R.layout.relay_item, parent, false);