Androidビューから継承元を作成して以来、よくエラーBinary XML file line XX: Error inflating class
が表示されます。この特殊なケースでは、BottomSheet
となります。バイナリXMLファイルの行XX:Error inflating class BottomSheetを継承するとき
public class MyBottomSheet extends TableLayout {
BottomSheetBehavior myBottomSheetBehavior;
ImageView testImageView;
public MyBottomSheet(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
testImageView = (ImageView) findViewById(R.id.imageView); // still OK...
myBottomSheetBehavior = BottomSheetBehavior.from(this); // crashes Here
testImageView.setOnClickListener(onClickListener); // or here if to remove the previous row
}
// ...
}
私のアプリには、個別の断片を持つ複数のタブがあります。 BottomSheet
には、そのうちの1つのみが必要ですが、BottomSheet
をMainActivityマークアップに含めないと、移動しません。だから、コードは次のとおりです。
activity_main.xml
<?xml version="1.0"encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- ... -->
<include layout="@layout/my_bottom_sheet"/>
</android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.DrawerLayout>
my_bottom_sheet.xml
<?xml version="1.0" encoding="utf-8"?>
<com.example.bottomsheettest.widgets.MyBottomSheet
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/myBottomSheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="*"
tools:context="com.example.bottomsheettest.MainActivityFragment"
tools:showIn="@layout/activity_main">
<TableRow>
<ImageView
android:id="@+id/imageView"
android:src="@mipmap/ic_launcher"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
/>
</TableRow>
</com.example.bottomsheettest.widgets.MyBottomSheet>
MainActivityFragment.java
public class MainActivityFragment extends Fragment {
private static final int LAYOUT = R.layout.fragment_main;
private MainViewFAB fab;
private MyBottomSheet addNewItemToInboxBottomSheet;
public MainActivityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
MainActivity activity = (MainActivity)getActivity();
fab = activity.getMainViewFab();
addNewItemToInboxBottomSheet = (MyBottomSheet) activity.findViewById(R.id.myBottomSheet);
return inflater.inflate(LAYOUT, container, false);
}
}
Android Viewsの継承に関して何か重要なことを忘れたと思います。しかし、この場合は特に奇妙です。 MyBottomSheet
クラスでは、BottomSheet
からImageView
を取得する際に問題はありません。したがって、それぞれのクラスからのBottomSheet
へのアクセスが利用可能である。しかし、BottomSheet
に関連するsomethigを操作しようとすると、例外が発生します。いくつかの答えを受け入れる時にアンドロイドStudioで作成
私はsource code(.zipファイル)を共有します。共有アプリにはタブはありませんが、元のアプリに存在するため、フラグメント構造を維持しました。
'ImageView'の' setOnClickListener() '呼び出しは、コンストラクタのカスタム' View'にまだ追加されていないため、クラッシュします。代わりに 'onFinishInflate()'でそれを行うことができます。'BottomSheetBehavior'クラッシュのエラーは何ですか? –
ああ、実際には、あなたのカスタム 'View'のコンストラクタに' LayoutParams'がまだセットされておらず、 'BottomSheetBehavior.from()'が 'IllegalArgumentException'をスローするので、クラッシュすると思います。あなたは 'onFinishInflate()'でもそうすることができます。 –
@Mike M: 'BottomSheetBehavior'と' Listener'の両方でエラーがあります: 'android.view.InflateException:バイナリXMLファイル行#31'(はい、行番号まで同じです)。私は 'LayoutParams'についての理論をチェックし、再び書きます。 –