小さなデモチャットUIアプリケーションがあります。このアプリケーションには、下部のナビゲーションバーがあります。キーボードが表示されたときに非表示にする下部のナビゲーションバーが必要です。
EditText要素をクリックするとわかるように、キーボードは表示されますが、下部のナビゲーションバーは表示されたままです。 この測定方法 などの方法を試しましたが、UI要素がちらつきます このように 。
キーボードが表示されているときに下部のナビゲーションバーを非表示にする適切な方法はありますか?
EDIT:以下のアクティビティでは、キーボードが表示されていると判断されたときにUI要素の位置を調整するためにキーボードリスナーを設定する場所を確認できます。
これは私のアクティビティコードで、上記のリンクのsetKeyboardListenerメソッドを使用して、onCreateViewで設定します。
package uk.cal.codename.projectnedry.TeamChatFragment;
import Android.annotation.SuppressLint;
import Android.content.Context;
import Android.content.res.Configuration;
import Android.content.res.Resources;
import Android.graphics.Rect;
import Android.net.Uri;
import Android.os.Build;
import Android.os.Bundle;
import Android.support.v4.app.Fragment;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.LinearLayoutManager;
import Android.support.v7.widget.RecyclerView;
import Android.text.Layout;
import Android.util.DisplayMetrics;
import Android.util.Log;
import Android.util.TypedValue;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.view.ViewTreeObserver;
import Android.view.Window;
import Android.view.WindowManager;
import Android.view.inputmethod.InputMethodManager;
import Android.widget.Button;
import Android.widget.EditText;
import Android.widget.FrameLayout;
import Android.widget.ImageButton;
import Android.widget.LinearLayout;
import Android.widget.RelativeLayout;
import Android.widget.Toast;
import com.roughike.bottombar.BottomBar;
import Java.util.ArrayList;
import butterknife.BindView;
import butterknife.ButterKnife;
import uk.cal.codename.projectnedry.R;
import uk.cal.codename.projectnedry.TeamChatFragment.ListAdapter.TeamChatListAdapter;
import uk.demo.cal.genericmodelviewpresenter.GenericMvp.GenericMvpFragment;
import static Android.view.View.GONE;
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link TeamChatView.OnFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link TeamChatView#newInstance} factory method to
* create an instance of this fragment.
*/
public class TeamChatView extends GenericMvpFragment implements TeamChatContract.RequiredViewOps {
private OnFragmentInteractionListener mListener;
@BindView(R.id.teamChatList)
RecyclerView mTeamChatRecyclerView;
@BindView(R.id.teamChatSendButton)
ImageButton mTeamChatSendButton;
@BindView(R.id.messageTextInput)
EditText mMessageTextInput;
TeamChatListAdapter mTeamChatListAdapter;
TeamChatListAdapter.ClickListener mTeamChatListClickListener;
private ArrayList<String> mTestMessageList;
public interface OnKeyboardVisibilityListener {
void onVisibilityChanged(boolean visible);
}
public final void setKeyboardListener(final OnKeyboardVisibilityListener listener) {
final View activityRootView = ((ViewGroup) getActivity().findViewById(Android.R.id.content)).getChildAt(0);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
private boolean wasOpened;
private final int DefaultKeyboardDP = 100;
// From @nathanielwolf answer... Lollipop includes button bar in the root. Add height of button bar (48dp) to maxDiff
private final int EstimatedKeyboardDP = DefaultKeyboardDP + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop ? 48 : 0);
private final Rect r = new Rect();
@Override
public void onGlobalLayout() {
// Convert the dp to pixels.
int estimatedKeyboardHeight = (int) TypedValue
.applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP, activityRootView.getResources().getDisplayMetrics());
// Conclude whether the keyboard is shown or not.
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
boolean isShown = heightDiff >= estimatedKeyboardHeight;
if (isShown == wasOpened) {
Log.d("Keyboard state", "Ignoring global layout change...");
return;
}
wasOpened = isShown;
listener.onVisibilityChanged(isShown);
}
});
}
public TeamChatView() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @return A new instance of fragment TeamChatView.
*/
public static TeamChatView newInstance() {
TeamChatView fragment = new TeamChatView();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@SuppressLint("MissingSuperCall")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(TeamChatPresenter.class, TeamChatModel.class, savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View view = inflater.inflate(R.layout.fragment_team_chat_view, container, false);
this.mUnbinder = ButterKnife.bind(this, view);
mTestMessageList = new ArrayList<>();
this.mTeamChatListAdapter = new TeamChatListAdapter(mTestMessageList);
this.mTeamChatRecyclerView.setAdapter(this.mTeamChatListAdapter);
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
this.mTeamChatRecyclerView.setLayoutManager(linearLayoutManager);
this.mTeamChatSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!String.valueOf(mMessageTextInput.getText()).equals("")) {
getSpecificImpOfGenericPresenter().sendMessage(String.valueOf(mMessageTextInput.getText()));
mMessageTextInput.setText("");
mTeamChatRecyclerView.smoothScrollToPosition(mTestMessageList.size());
}
}
});
setKeyboardListener(new OnKeyboardVisibilityListener(){
@Override
public void onVisibilityChanged(boolean visible) {
RelativeLayout contentFrame = (RelativeLayout) getActivity().findViewById(R.id.content_company_navigation);
BottomBar lowerNavigationBar = (BottomBar) getActivity().findViewById(R.id.bottomBar);
if (visible) { // if more than 100 pixels, its probably a keyboard...
lowerNavigationBar.setVisibility(GONE);
contentFrame.setPadding(0, 0, 0, 0);
mTeamChatRecyclerView.smoothScrollToPosition(mTestMessageList.size());
} else {
contentFrame.setPadding(0, 0, 0, convertDpToPixel(60, getContext()));
mTeamChatRecyclerView.smoothScrollToPosition(mTestMessageList.size());
lowerNavigationBar.setVisibility(View.VISIBLE);
}
}
});
return view;
}
/**
* This method converts dp unit to equivalent pixels, depending on device density.
*
* @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels
* @param context Context to get resources and device specific display metrics
* @return A float value to represent px equivalent to dp depending on device density
*/
public static int convertDpToPixel(float dp, Context context){
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
int px = (int) (dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
return px;
}
public void addToTestMessageList(String str){
this.mTestMessageList.add(str);
this.mTeamChatListAdapter.notifyDataSetChanged();
}
@Override
public void onDestroyView() {
super.onDestroyView();
// getView().getViewTreeObserver().removeGlobalOnLayoutListener(test);
}
@Override
public TeamChatPresenter getSpecificImpOfGenericPresenter() {
return (TeamChatPresenter) this.mPresenter;
}
}
これは私のXMLレイアウトです:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
tools:context="uk.cal.codename.projectnedry.TeamChatFragment.TeamChatView">
<Android.support.v7.widget.RecyclerView
Android:layout_above="@+id/chatViewMessageEntryLayout"
Android:id="@+id/teamChatList"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_alignParentTop="true"
Android:isScrollContainer="false"
Android:paddingTop="10dp"
Android:scrollbars="vertical" />
<RelativeLayout
Android:id="@+id/chatViewMessageEntryLayout"
Android:layout_width="match_parent"
Android:layout_height="60dp"
Android:layout_alignParentBottom="true"
Android:orientation="horizontal">
<View
Android:id="@+id/chatViewMessageEntrySeperator"
Android:layout_width="match_parent"
Android:layout_height="1dp"
Android:background="#e3e3e8" />
<EditText
Android:id="@+id/messageTextInput"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_gravity="center_vertical"
Android:layout_below="@+id/chatViewMessageEntrySeperator"
Android:layout_toLeftOf="@+id/teamChatSendButton"
Android:background="@Android:color/transparent"
Android:hint="Enter message"
Android:inputType="textCapSentences|textMultiLine"
Android:maxLength="1000"
Android:maxLines="4"
Android:paddingLeft="10dp" />
<ImageButton
Android:id="@+id/teamChatSendButton"
Android:layout_width="50dp"
Android:layout_height="match_parent"
Android:layout_alignParentRight="true"
Android:layout_gravity="center"
Android:background="#00B9EF"
Android:src="@drawable/ic_send_white_24dp" />
</RelativeLayout>
</RelativeLayout>
最も簡単な実装、AndroidManifest.xmlの追加
<activity Android:windowSoftInputMode="adjustPan"/>
うまくいけば、これが誰かの助けになります。楽しい !
このようにマニフェストにこのコードを追加するだけです。
<activity Android:name=".MainActivity"
Android:windowSoftInputMode="adjustPan">
これは私のために働きます..幸せなコーディング
私の場合、DrawerLayoutをいくつかのレイアウトコンテンツとナビゲーションボトムバーを持つ親ビューとして使用しています。マニフェストファイルに「Android:windowSoftInputMode = "adjustPan」を追加します。このTAGのアクティビティとこれが正常に機能します。
Activity
またはFragment
のonResume()
にこの行を追加します。
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
それは私のために働いています。一度試してみてください。
属性を追加します:Android:windowSoftInputMode="adjustResize""
activity
タグ内のマニフェスト内:
<activity
Android:name=".YourActivity"
Android:windowSoftInputMode="adjustResize"/>
NB:私は、NestedScrollViewを親レイアウトとして使用することをお勧めします。
お役に立てれば。