片段-android.view.InflateException:二进制XML文件
我在这里读了很多关于这个错误的文章,但是到目前为止没有任何帮助。我得到的错误是:片段-android.view.InflateException:二进制XML文件,android,xml,android-layout,android-fragments,Android,Xml,Android Layout,Android Fragments,我在这里读了很多关于这个错误的文章,但是到目前为止没有任何帮助。我得到的错误是: android.view.InflateException: Binary XML file line #10: error inflating class fragment 我正在制作一个Twitter客户端应用程序,并使用我的ComposeTweetActivity.java中的一个片段。所以我有这个类和一个片段类,然后每个类都有一个布局。我将发布所有4个文件和我的日志。如果你需要看更多,请告诉我。事先非常感
android.view.InflateException: Binary XML file line #10: error inflating class fragment
我正在制作一个Twitter客户端应用程序,并使用我的ComposeTweetActivity.java中的一个片段。所以我有这个类和一个片段类,然后每个类都有一个布局。我将发布所有4个文件和我的日志。如果你需要看更多,请告诉我。事先非常感谢
tweetActivity.java
package com.codepath.apps.mytwitterapp.activities;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import com.codepath.apps.mytwitterapp.R;
import com.codepath.apps.mytwitterapp.fragments.ComposeTweetFragment.OnComposeTweetListener;
import com.codepath.apps.mytwitterapp.models.Tweet;
/**
* Class hosts fragment for composing and posting tweets
*/
public class ComposeTweetActivity extends ActionBarActivity implements OnComposeTweetListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_compose_tweet);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.compose_tweet, menu);
return true;
}
@Override
public void onTweetCanceled() {
Intent i = new Intent();
setResult(RESULT_CANCELED, i);
finish();
}
@Override
public void onTweetPosted(Tweet postedTweet) {
Intent i = new Intent();
i.putExtra("new_tweet", postedTweet);
setResult(RESULT_OK, i);
finish();
}
}
package com.codepath.apps.mytwitterapp.fragments;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.codepath.apps.mytwitterapp.R;
import com.codepath.apps.mytwitterapp.activities.MyTwitterApp;
import com.codepath.apps.mytwitterapp.helpers.AsyncTweetSave;
import com.codepath.apps.mytwitterapp.models.Tweet;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.nostra13.universalimageloader.core.ImageLoader;
/**
* Class represents a screen to compose and post tweets. User is warned if text
* typed passes the 140-character limit
*/
public class ComposeTweetFragment extends Fragment {
private Activity activity;
private Button btnCancel,
btnTweet;
private ImageView ivUserImage;
private TextView tvUserName;
private EditText etNewTweet;
private boolean alreadyToasted = false;
private OnComposeTweetListener listener;
public interface OnComposeTweetListener {
public void onTweetPosted(Tweet postedTweet);
public void onTweetCanceled();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof OnComposeTweetListener) {
listener = (OnComposeTweetListener) activity;
} else {
throw new ClassCastException(activity.toString() + " must implement "
+ "OnTweetComposedListener interface");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
super.onCreateView(inflater, parent, savedInstanceState);
View v = inflater.inflate(R.layout.fragment_compose_tweet, parent, false);
setupButtons(v);
setupImageView(v);
setupTextView(v);
setupEditText(v);
return v;
}
private void setupButtons(View v) {
btnCancel = (Button) v.findViewById(R.id.btnCancel);
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onTweetCanceled();
}
});
btnTweet = (Button) v.findViewById(R.id.btnTweet);
btnTweet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String tweetBody = etNewTweet.getText().toString();
tweet(tweetBody);
}
});
}
private void setupImageView(View v) {
ivUserImage = (ImageView) v.findViewById(R.id.ivUserImage);
ImageLoader.getInstance().displayImage(getActivity().getIntent()
.getStringExtra("user_image_url"), ivUserImage);
}
private void setupTextView(View v) {
tvUserName = (TextView) v.findViewById(R.id.tvUserName);
tvUserName.setText("@" + getActivity().getIntent().getStringExtra("screen_name"));
}
private void setupEditText(View v) {
etNewTweet = (EditText) v.findViewById(R.id.etNewTweet);
// Show soft keyboard when EditText field requests focus
if (etNewTweet.requestFocus()) {
InputMethodManager mgr = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(etNewTweet, InputMethodManager.SHOW_IMPLICIT);
}
etNewTweet.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!alreadyToasted && s.length() == 140) {
Toast.makeText(activity, "You've reached the 140-character"
+ " limit", Toast.LENGTH_LONG).show();
alreadyToasted = true;
}
else if (s.length() > 140) {
etNewTweet.setTextColor(Color.RED);
} else {
etNewTweet.setTextColor(Color.BLACK);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void afterTextChanged(Editable s) { }
});
}
private void tweet(String tweetBody) {
MyTwitterApp.getRestClient().postTweet(tweetBody, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, JSONObject jsonTweetResponse) {
Tweet newTweet = Tweet.fromJson(jsonTweetResponse);
new AsyncTweetSave().execute(newTweet); // Might need to disable
listener.onTweetPosted(newTweet);
}
@Override
public void onFailure(Throwable e, JSONObject error) {
Log.e("ERROR", e.getMessage());
}
});
}
}
ComposeTweetFragment.java
package com.codepath.apps.mytwitterapp.activities;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import com.codepath.apps.mytwitterapp.R;
import com.codepath.apps.mytwitterapp.fragments.ComposeTweetFragment.OnComposeTweetListener;
import com.codepath.apps.mytwitterapp.models.Tweet;
/**
* Class hosts fragment for composing and posting tweets
*/
public class ComposeTweetActivity extends ActionBarActivity implements OnComposeTweetListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_compose_tweet);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.compose_tweet, menu);
return true;
}
@Override
public void onTweetCanceled() {
Intent i = new Intent();
setResult(RESULT_CANCELED, i);
finish();
}
@Override
public void onTweetPosted(Tweet postedTweet) {
Intent i = new Intent();
i.putExtra("new_tweet", postedTweet);
setResult(RESULT_OK, i);
finish();
}
}
package com.codepath.apps.mytwitterapp.fragments;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.codepath.apps.mytwitterapp.R;
import com.codepath.apps.mytwitterapp.activities.MyTwitterApp;
import com.codepath.apps.mytwitterapp.helpers.AsyncTweetSave;
import com.codepath.apps.mytwitterapp.models.Tweet;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.nostra13.universalimageloader.core.ImageLoader;
/**
* Class represents a screen to compose and post tweets. User is warned if text
* typed passes the 140-character limit
*/
public class ComposeTweetFragment extends Fragment {
private Activity activity;
private Button btnCancel,
btnTweet;
private ImageView ivUserImage;
private TextView tvUserName;
private EditText etNewTweet;
private boolean alreadyToasted = false;
private OnComposeTweetListener listener;
public interface OnComposeTweetListener {
public void onTweetPosted(Tweet postedTweet);
public void onTweetCanceled();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof OnComposeTweetListener) {
listener = (OnComposeTweetListener) activity;
} else {
throw new ClassCastException(activity.toString() + " must implement "
+ "OnTweetComposedListener interface");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
super.onCreateView(inflater, parent, savedInstanceState);
View v = inflater.inflate(R.layout.fragment_compose_tweet, parent, false);
setupButtons(v);
setupImageView(v);
setupTextView(v);
setupEditText(v);
return v;
}
private void setupButtons(View v) {
btnCancel = (Button) v.findViewById(R.id.btnCancel);
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onTweetCanceled();
}
});
btnTweet = (Button) v.findViewById(R.id.btnTweet);
btnTweet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String tweetBody = etNewTweet.getText().toString();
tweet(tweetBody);
}
});
}
private void setupImageView(View v) {
ivUserImage = (ImageView) v.findViewById(R.id.ivUserImage);
ImageLoader.getInstance().displayImage(getActivity().getIntent()
.getStringExtra("user_image_url"), ivUserImage);
}
private void setupTextView(View v) {
tvUserName = (TextView) v.findViewById(R.id.tvUserName);
tvUserName.setText("@" + getActivity().getIntent().getStringExtra("screen_name"));
}
private void setupEditText(View v) {
etNewTweet = (EditText) v.findViewById(R.id.etNewTweet);
// Show soft keyboard when EditText field requests focus
if (etNewTweet.requestFocus()) {
InputMethodManager mgr = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(etNewTweet, InputMethodManager.SHOW_IMPLICIT);
}
etNewTweet.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!alreadyToasted && s.length() == 140) {
Toast.makeText(activity, "You've reached the 140-character"
+ " limit", Toast.LENGTH_LONG).show();
alreadyToasted = true;
}
else if (s.length() > 140) {
etNewTweet.setTextColor(Color.RED);
} else {
etNewTweet.setTextColor(Color.BLACK);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void afterTextChanged(Editable s) { }
});
}
private void tweet(String tweetBody) {
MyTwitterApp.getRestClient().postTweet(tweetBody, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, JSONObject jsonTweetResponse) {
Tweet newTweet = Tweet.fromJson(jsonTweetResponse);
new AsyncTweetSave().execute(newTweet); // Might need to disable
listener.onTweetPosted(newTweet);
}
@Override
public void onFailure(Throwable e, JSONObject error) {
Log.e("ERROR", e.getMessage());
}
});
}
}
activity\u compose\u tweet.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#185277"
tools:context="com.codepath.apps.mytwitterapp.activities.ComposeTweetActivity"
tools:ignore="MergeRootFrame" >
<fragment
android:id="@+id/fragmentComposeTweet"
android:name="com.codepath.apps.mytwitterapp.fragments.ComposeTweetFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
tools:layout="@android:layout/fragment_compose_tweet" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#185277" >
<Button
android:id="@+id/btnCancel"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="20dp"
android:layout_marginTop="30dp"
android:background="@drawable/cancel_button_outline"
android:textColor="#ffffff"
android:text="@string/btn_cancel" />
<Button
android:id="@+id/btnTweet"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="20dp"
android:layout_marginTop="30dp"
android:background="@drawable/tweet_button_outline"
android:textColor="#ffffff"
android:textStyle="bold"
android:text="@string/btn_tweet" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_alignLeft="@+id/btnCancel"
android:layout_below="@+id/btnCancel"
android:layout_marginRight="20dp"
android:layout_marginTop="50dp"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:background="#ffffff"
android:orientation="horizontal" >
<ImageView
android:id="@+id/ivUserImage"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_margin="10dp"
android:src="@drawable/ic_action_user_profile_dark" />
<TextView
android:id="@+id/tvUserName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/ivUserImage"
android:textStyle="bold|italic"
android:text="@string/twitter_handle" />
</RelativeLayout>
<EditText
android:id="@+id/etNewTweet"
android:layout_width="match_parent"
android:layout_height="160dp"
android:padding="10dp"
android:background="#ffffff"
android:gravity="top"
android:hint="@string/et_new_tweet_hint"
android:inputType="textEmailAddress|textCapSentences|textMultiLine"
android:imeOptions="actionDone" />
</LinearLayout>
</RelativeLayout>
改变这个
InputMethodManager mgr = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
到
这个
在ComposeTweetFragment中的第113行是什么?您好,它是InputMethodManager:'if(etnewweet.requestFocus()){InputMethodManager mgr=(InputMethodManager)activity.getSystemService(Context.INPUT_方法_服务);mgr.showSoftInput(etnewweet,InputMethodManager.SHOW_隐式);}“好吧,那就听拉古南丹的回答吧。非常感谢!这解决了撞车问题。我现在至少可以打开活动了(虽然还有其他错误,但这一个已经修复)。但我很好奇,为什么在活动中出现错误时它会指向我的XML?有什么想法吗?作为一个初学者,我一直在努力理解神秘的航海日志P
private Activity activity;