Java 错误:android.view.InflateException:二进制XML文件行#8:二进制XML文件行#8:膨胀类片段时出错
我正在尝试创建一个游戏,在这个游戏中,你可以与连接到一个房间的一群人聊天。我想在片段中进行聊天,我希望它在横向模式下位于UI(实际游戏活动)的右侧。我在片段布局和EditText中使用ListView。我看到了各种各样的答案,但找不到解决办法。 我正在使用firebase实时数据库在listview中插入数据。 感谢您的帮助 主要游戏活动:Java 错误:android.view.InflateException:二进制XML文件行#8:二进制XML文件行#8:膨胀类片段时出错,java,android,xml,listview,android-fragments,Java,Android,Xml,Listview,Android Fragments,我正在尝试创建一个游戏,在这个游戏中,你可以与连接到一个房间的一群人聊天。我想在片段中进行聊天,我希望它在横向模式下位于UI(实际游戏活动)的右侧。我在片段布局和EditText中使用ListView。我看到了各种各样的答案,但找不到解决办法。 我正在使用firebase实时数据库在listview中插入数据。 感谢您的帮助 主要游戏活动: package com.example.lrmah.rajaranichorpolice; import android.support.v7.app.A
package com.example.lrmah.rajaranichorpolice;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.lrmah.rajaranichorpolice.Chat.chatFragmentActivity;
public class mainGameActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_game);
Bundle bundle=new Bundle();
bundle.putString("name", "From Activity");
//set Fragmentclass Arguments
chatFragmentActivity fragobj=new chatFragmentActivity();
fragobj.setArguments(bundle);
}
}
聊天室碎片活动:
package com.example.lrmah.rajaranichorpolice.Chat;
import android.app.Fragment;
import android.app.ListFragment;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.ProgressBar;
import com.example.lrmah.rajaranichorpolice.R;
import com.example.lrmah.rajaranichorpolice.playerClass;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.example.lrmah.rajaranichorpolice.playerClass;
import java.util.ArrayList;
import java.util.List;
public class chatFragmentActivity extends Fragment {
public static final String ANONYMOUS = "anonymous";
public static final int DEFAULT_MSG_LENGTH_LIMIT = 1000;
private ListView mMessageListView;
private MessageAdapter mMessageAdapter;
private ProgressBar mProgressBar;
private ImageButton mPhotoPickerButton;
private EditText mMessageEditText;
private Button mSendButton;
private String mUsername;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mMessagesDatabaseReference;
private ChildEventListener mChildEventListener;
private DatabaseReference mMessagesRoomDatabaseReference;
List<playerClass> playerClassList = new ArrayList<>();
String roomCode;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
initViews();
return inflater.inflate(R.layout.chat_fragment_layout,container,false);
//accesing database
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onDestroyView() {
super.onDestroyView();
}
@Override
public void onDetach() {
super.onDetach();
}
public void getDatabaseReferences()
{
mFirebaseDatabase= FirebaseDatabase.getInstance();
mMessagesDatabaseReference = mFirebaseDatabase.getReference().child("messages");
mMessagesRoomDatabaseReference=mMessagesDatabaseReference.child(roomCode);
}
public void textChangedMethod()
{
mMessageEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (charSequence.toString().trim().length() > 0) {
mSendButton.setEnabled(true);
} else {
mSendButton.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
mMessageEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(DEFAULT_MSG_LENGTH_LIMIT)});
}
public void childEventListenerMethod()
{
mChildEventListener= new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
playerClass playerClassOBJ= dataSnapshot.getValue(playerClass.class);
mMessageAdapter.add(playerClassOBJ);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
mMessagesDatabaseReference.addChildEventListener(mChildEventListener);
}
public void initListView()
{
mMessageAdapter = new MessageAdapter(getActivity(), R.layout.item_message, playerClassList);
mMessageListView = (ListView) getActivity().findViewById(R.id.messageListView);
mMessageListView.setAdapter(mMessageAdapter);
}
public void onClickingSend()
{
// Send button sends a message and clears the EditText
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO: Send messages on click
playerClass playerClassOBJ = new playerClass(null, mUsername, mMessageEditText.getText().toString(),null,null);
//push the message to database in the node "messages"
mMessagesRoomDatabaseReference.push().setValue(playerClassOBJ);
// Clear input box
mMessageEditText.setText("");
}
});
}
public void getRoomCode()
{
//passing value from activity
roomCode=getArguments().getString("name");
}
public void initViews()
{
mProgressBar = (ProgressBar) getView().findViewById(R.id.progressBar);
mPhotoPickerButton = (ImageButton) getView().findViewById(R.id.photoPickerButton);
mMessageEditText = (EditText) getView().findViewById(R.id.messageEditText);
mSendButton = (Button) getView().findViewById(R.id.sendButton);
// Initialize progress bar
mProgressBar.setVisibility(ProgressBar.INVISIBLE);
}
}
您应该首先对布局进行
充气
以获得片段的视图,然后尝试在onCreateView
中访问视图initViews()
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
final View view = inflater.inflate(R.layout.chat_fragment_layout, container, false);
initViews(view);
return view;
}
因此,请尝试将其修改为:
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.chat_fragment_layout, container, false);
initViews();
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
return rootView;
}
在
chatFragmentActivity
中,在onCreateView
方法完成之前,您不能调用initViews()
,因为getView()
将返回null
。您可以重写onCreateView
方法,并将视图传递给initViews
类似的内容:
public void initViews(final View view) {
mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar);
mPhotoPickerButton = (ImageButton) view.findViewById(R.id.photoPickerButton);
mMessageEditText = (EditText) view.findViewById(R.id.messageEditText);
mSendButton = (Button) view.findViewById(R.id.sendButton);
mProgressBar.setVisibility(ProgressBar.INVISIBLE);
}
然后将视图传递到onCreateView
中的initViews
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
final View view = inflater.inflate(R.layout.chat_fragment_layout, container, false);
initViews(view);
return view;
}
根据我的说法,你可以尝试用其他方法来膨胀你的碎片,比如: 在主活动布局中为片段添加容器。你可以简单地用这个替换
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:layout_width="50dp"
android:layout_height="50dp" />
</RelativeLayout>
而且你还面临着列表id的问题,你可以参考这个
希望这会有所帮助。那么可能是因为
rootView
在getView()方法中不可用,直到onCreateView
返回。我建议尝试上面的@MarkusPenguin解决方案谢谢您的快速响应。容器属于哪个类?(在container=(FrameLayout)findViewById(R.id.container)中;此onCreate()方法属于代码中作为mainGameActivity的main活动。我按照您的建议执行了操作,并收到一条错误消息:“java.lang.RuntimeException:内容具有id属性为'android.R.id.list'的视图,它不是ListView类”我在我的回答的最后一行提到了这个错误的解决方案“而且你还面临列表id的问题,你可以参考这个链接”检查链接……我用fragment only扩展了我的片段,而不是ListFragment,你可以根据你的要求选择。谢谢你Raghav Sharma。它很有魅力。我把它改为fragment only,然后初始化了我的列表,解决了这个问题。谢谢你的快速响应。我已经完成了你说的,我正在准备g同样的错误。
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
final View view = inflater.inflate(R.layout.chat_fragment_layout, container, false);
initViews(view);
return view;
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:layout_width="50dp"
android:layout_height="50dp" />
</RelativeLayout>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
container = (FrameLayout) findViewById(R.id.container);
//set Fragment to activity
BlankFragment frag = new BlankFragment();
getFragmentManager().beginTransaction().add(R.id.container,frag).commit();
}