在布局中膨胀菜单不起作用

时间:2017-08-12 17:55:01

标签: android android-layout menu layout-inflater

我有一个布局,我想用菜单充气。问题是这并没有膨胀到它。我尝试了很多方法,基本上这只是找到的方式。

 public class PostDetailActivity extends AppCompatActivity implements View.OnClickListener {

public static final String EXTRA_POST_KEY = "post_key";
private static final String TAG = "PostDetailActivity";
private static ProgressDialog progress;
private DatabaseReference mPostReference;
private DatabaseReference mCommentsReference;
private ValueEventListener mPostListener;
private String mPostKey;
private CommentAdapter mAdapter;
private TextView numStarsView;
private TextView mAuthorView;
private TextView mAuthorEmailView;
private ImageView mAuthorPhotoView;
private TextView mTitleView;
private TextView mBodyView;
private EditText mCommentField;
private Button mCommentButton;
private RecyclerView mCommentsRecycler;
private TextView mStreamView;
private TextView mSubjectView;
private LinearLayoutManager mCommentManager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_post_detail);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //progress bar for network check
    SpannableStringBuilder loadingText = new SpannableStringBuilder();
    loadingText.append("Server not reachable.Check internet Connection");
    loadingText.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0,
            loadingText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    progress = new ProgressDialog(this);
    progress.setIndeterminate(true);
    progress.setCancelable(false);
    progress.setMessage(loadingText);
    progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);

    // Get post key from intent
    mPostKey = getIntent().getStringExtra(EXTRA_POST_KEY);
    if (mPostKey == null) {
        throw new IllegalArgumentException("Must pass EXTRA_POST_KEY");
    }

    // Initialize Database
    mPostReference = FirebaseDatabase.getInstance().getReference()
            .child("posts").child(mPostKey);
    mCommentsReference = FirebaseDatabase.getInstance().getReference()
            .child("post-comments").child(mPostKey);

    // Initialize Views
    mAuthorView = (TextView) findViewById(R.id.post_author);
    mAuthorEmailView = (TextView) findViewById(R.id.post_email);
    mAuthorPhotoView = (ImageView) findViewById(R.id.post_author_photo);
    mTitleView = (TextView) findViewById(R.id.post_title);

    mBodyView = (TextView) findViewById(R.id.post_body);
    numStarsView = (TextView) findViewById(R.id.post_num_stars_cmnt);
    mStreamView = (TextView) findViewById(R.id.post_stream);
    mSubjectView = (TextView) findViewById(R.id.post_subject);

    mCommentField = (EditText) findViewById(R.id.field_comment_text);
    mCommentButton = (Button) findViewById(R.id.button_post_comment);
    mCommentsRecycler = (RecyclerView) findViewById(R.id.recycler_comments);
    mCommentsRecycler.setNestedScrollingEnabled(false);
    mCommentButton.setOnClickListener(this);
    mCommentManager = new LinearLayoutManager(this);
    mCommentManager.setReverseLayout(true);
    mCommentManager.setStackFromEnd(true);
    mCommentsRecycler.setLayoutManager(mCommentManager);
    isOnlne();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.new_comment_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.inflating_comment_menu:
            // TODO update alert menu icon
            Toast.makeText(this, "update clicked", Toast.LENGTH_SHORT).show();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onStart() {
    super.onStart();
    isOnlne();
    // Add value event listener to the post
    // [START post_value_event_listener]
    ValueEventListener postListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // Get Post object and use the values to update the UI
            Post post = dataSnapshot.getValue(Post.class);
            // [START_EXCLUDE]
            mAuthorView.setText(post.author);
            mAuthorEmailView.setText(post.authorEmail);
            mTitleView.setText(post.title);
            mBodyView.setText(post.body);
            mStreamView.setText(post.stream);
            mSubjectView.setText(post.subject);
            if (post.userImage.equalsIgnoreCase("phone")) {
                mAuthorPhotoView.setImageResource(R.drawable.blue_call_icon);
                mAuthorEmailView.setVisibility(View.INVISIBLE);
            } else {
                mAuthorEmailView.setVisibility(View.VISIBLE);
                Picasso.with(PostDetailActivity.this).load(post.userImage)
                        .placeholder(R.drawable.google)
                        .error(R.drawable.ic_action_account_circle_40)
                        .into(mAuthorPhotoView);
            }
            // [END_EXCLUDE]
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            // Getting Post failed, log a message
            Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
            // [START_EXCLUDE]
            SpannableStringBuilder snackbarText = new SpannableStringBuilder();
            snackbarText.append("Failed to load comments,reload post");
            snackbarText.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0,
                    snackbarText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            Snackbar bar = Snackbar.make(findViewById(R.id.button_post_comment), snackbarText
                    , Snackbar.LENGTH_SHORT);
            View sbView = bar.getView();
            sbView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(),
                    R.color.pure_red));
            bar.show();
            // [END_EXCLUDE]
        }
    };
    mPostReference.addValueEventListener(postListener);
    // [END post_value_event_listener]

    // Keep copy of post listener so we can remove it when app stops
    mPostListener = postListener;

    // Listen for comments
    mAdapter = new CommentAdapter(this, mCommentsReference);
    mCommentsRecycler.setAdapter(mAdapter);
}

@Override
public void onStop() {
    super.onStop();

    // Remove post value event listener
    if (mPostListener != null) {
        mPostReference.removeEventListener(mPostListener);
    }

    // Clean up comments listener
    mAdapter.cleanupListener();
}

@Override
public void onClick(View v) {
    int i = v.getId();
    if (i == R.id.button_post_comment) {
        postComment();
    }

}

public String getUid() {

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    if (uid == null) {
        Intent intent = new Intent(getApplicationContext(), Login.class);
        startActivity(intent);
    }
    return uid;
}

private void postComment() {
    final String uid = getUid();
    final String userImage;
    FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
    String userEmail = currentUser.getEmail().toString();
    if ((userEmail != null) && (userEmail != "") && (userEmail.contains("@"))) {
        userImage = currentUser.getPhotoUrl().toString();
    } else {
        userImage = "phone";
    }
    FirebaseDatabase.getInstance().getReference().child("users").child(uid)
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    // Get user information
                    User user = dataSnapshot.getValue(User.class);
                    String authorName = user.username + " (" + user.email + ")";

                    // Create new comment object
                    String commentText = mCommentField.getText().toString();
                    if (TextUtils.isEmpty(commentText)) {
                        mCommentField.setError("comment shouldn't empty");
                        return;
                    }
                    isOnlne();
                    Comment comment = new Comment(uid, authorName, commentText, userImage);

                    // Push the comment, it will appear in the list
                    mCommentsReference.push().setValue(comment);
                    SpannableStringBuilder snackbarText = new SpannableStringBuilder();
                    snackbarText.append("Your comment has been added");
                    snackbarText.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0,
                            snackbarText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    Snackbar bar = Snackbar.make(findViewById(R.id.button_post_comment), snackbarText,
                            Snackbar.LENGTH_SHORT);
                    View sbView = bar.getView();
                    sbView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(),
                            R.color.colorPrimary));
                    bar.show();
                    // Clear the field
                    mCommentField.setText(null);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }

            });

}

public void isOnlne() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        changeStatus(true);
    } else {
        changeStatus(false);
    }
}

// Method to change the text status
public void changeStatus(boolean isConnected) {
    // Change status according to boolean value
    if (isConnected) {
        progress.dismiss();
    } else {
        progress.show();
    }
}

@Override
protected void onPause() {

    super.onPause();
    NetworkCheker.activityPaused();// On Pause notify the Application
}

@Override
protected void onResume() {

    super.onResume();
    NetworkCheker.activityResumed();// On Resume notify the Application
}

@Override
public boolean onSupportNavigateUp() {
    finish();
    return true;
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    onSupportNavigateUp();
}

private static class CommentViewHolder extends RecyclerView.ViewHolder {

    public TextView authorView;
    public TextView bodyView;
    public ImageView authorPhotoView;
    private Button commentDelete;

    public CommentViewHolder(final View itemView) {
        super(itemView);
        authorPhotoView = (ImageView) itemView.findViewById(R.id.comment_photo);
        authorView = (TextView) itemView.findViewById(R.id.comment_author);
        bodyView = (TextView) itemView.findViewById(R.id.comment_body);
        commentDelete = (Button) itemView.findViewById(R.id.comment_delete);
    }
}

private class CommentAdapter extends RecyclerView.Adapter<CommentViewHolder> {
    private Context mContext;
    private DatabaseReference mDatabaseReference;
    private ChildEventListener mChildEventListener;
    private List<String> mCommentIds = new ArrayList<>();
    private List<Comment> mComments = new ArrayList<>();


    public CommentAdapter(final Context context, DatabaseReference ref) {
        mContext = context;
        mDatabaseReference = ref;

        // Create child event listener
        // [START child_event_listener_recycler]
        ChildEventListener childEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
                Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());

                // A new comment has been added, add it to the displayed list
                Comment comment = dataSnapshot.getValue(Comment.class);

                // [START_EXCLUDE]
                // Update RecyclerView
                mCommentIds.add(dataSnapshot.getKey());
                mComments.add(comment);
                notifyItemInserted(mComments.size() - 1);
                mCommentManager.scrollToPosition(mComments.size() - 1);
                // [END_EXCLUDE]
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
                Log.d(TAG, "onChildChanged:" + dataSnapshot.getKey());

                // A comment has changed, use the key to determine if we are displaying this
                // comment and if so displayed the changed comment.
                Comment newComment = dataSnapshot.getValue(Comment.class);
                String commentKey = dataSnapshot.getKey();

                // [START_EXCLUDE]
                int commentIndex = mCommentIds.indexOf(commentKey);
                if (commentIndex > -1) {
                    // Replace with the new data
                    mComments.set(commentIndex, newComment);

                    // Update the RecyclerView
                    notifyItemChanged(commentIndex);
                    mCommentManager.scrollToPosition(commentIndex);
                } else {
                    Log.w(TAG, "onChildChanged:unknown_child:" + commentKey);
                }
                // [END_EXCLUDE]
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
                Log.d(TAG, "onChildRemoved:" + dataSnapshot.getKey());
                // A comment has changed, use the key to determine if we are displaying this
                // comment and if so remove it.
                String commentKey = dataSnapshot.getKey();

                // [START_EXCLUDE]
                int commentIndex = mCommentIds.indexOf(commentKey);
                if (commentIndex > -1) {
                    // Remove data from the list
                    mCommentIds.remove(commentIndex);
                    mComments.remove(commentIndex);
                    SpannableStringBuilder snackbarText = new SpannableStringBuilder();
                    snackbarText.append("Comment has been removed");
                    snackbarText.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0,
                            snackbarText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    Snackbar bar = Snackbar.make(findViewById(R.id.button_post_comment), snackbarText
                            , Snackbar.LENGTH_SHORT);
                    View sbView = bar.getView();
                    sbView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(),
                            R.color.pure_red));
                    bar.show();
                    // Update the RecyclerView
                    notifyItemRemoved(commentIndex);
                    mCommentManager.scrollToPosition(commentIndex);
                } else {
                    Log.w(TAG, "onChildRemoved:unknown_child:" + commentKey);
                }
                // [END_EXCLUDE]
            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
                Log.d(TAG, "onChildMoved:" + dataSnapshot.getKey());

                // A comment has changed position, use the key to determine if we are
                // displaying this comment and if so move it.
                Comment movedComment = dataSnapshot.getValue(Comment.class);
                String commentKey = dataSnapshot.getKey();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.w(TAG, "postComments:onCancelled", databaseError.toException());
                SpannableStringBuilder snackbarText = new SpannableStringBuilder();
                snackbarText.append("Failed to load comments.");
                snackbarText.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0,
                        snackbarText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                Snackbar bar = Snackbar.make(findViewById(R.id.button_post_comment),
                        snackbarText, Snackbar.LENGTH_SHORT);
                View sbView = bar.getView();
                sbView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(),
                        R.color.pure_red));
            }
        };
        ref.addChildEventListener(childEventListener);
        // [END child_event_listener_recycler]

        // Store reference to listener so it can be removed on app stop
        mChildEventListener = childEventListener;


    }

    @Override
    public CommentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.item_comment, parent, false);
        return new CommentViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final CommentViewHolder holder, final int position) {
        final Comment comment = mComments.get(position);
        final String commentKey = mCommentIds.get(position);
        holder.authorView.setText(comment.author);
        holder.bodyView.setText(comment.text);
        if (comment.userImage.equalsIgnoreCase("phone")) {
            holder.authorPhotoView.setImageResource(R.drawable.blue_call_icon);

        } else {
            Picasso.with(mContext).load(comment.userImage)
                    .placeholder(R.drawable.google)
                    .error(R.drawable.ic_action_account_circle_40)
                    .into(holder.authorPhotoView);
        }
        if (comment.uid.matches(getUid())) {
            holder.commentDelete.setVisibility(View.VISIBLE);
        } else {
            holder.commentDelete.setVisibility(View.GONE);
        }
        holder.commentDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(PostDetailActivity.this);
                builder.setMessage("Are you sure you want to delete this comment?")
                        .setCancelable(false)
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                mCommentsReference.child(commentKey).getRef().removeValue();
                            }
                        })
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });
                AlertDialog alert = builder.create();
                alert.show();
            }

        });
    }

    @Override
    public int getItemCount() {
        numStarsView.setText(String.valueOf(mComments.size()));
        return mComments.size();
    }

    public void cleanupListener() {
        if (mChildEventListener != null) {
            mDatabaseReference.removeEventListener(mChildEventListener);
        }
    }
 }}

我膨胀的菜单代码

    <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
    android:id="@+id/inflating_comment_menu"
    android:actionLayout="@layout/new_comment_menu"
    android:title=""
    app:showAsAction="always" />
</menu>

和动作布局中使用的布局是

   <?xml version="1.0" encoding="utf-8"?>
   <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <include
        android:id="@+id/post_author_layout_inflate"
        layout="@layout/include_post_author"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true" />

    <LinearLayout
        android:id="@+id/star_layout_inflate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/post_author_layout"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@+id/post_author_layout"
        android:layout_marginRight="10dp"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/star_cmnt_inflate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="5dp"
            android:background="?attr/selectableItemBackground"
            android:src="@drawable/ic_create_black_24dp" />

        <TextView
            android:id="@+id/post_num_stars_cmnt_inflate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textColor="#000"
            android:textStyle="bold"
            tools:text="7" />

    </LinearLayout>

</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

您应该使用app:actionLayout="@layout/inflating_comment_menu"代替android:actionLayout="@layout/inflating_comment_menu"

请检查:https://stackoverflow.com/a/23228941/3029553