2

メモ アプリケーションには、画面上に 2 つのフラグメントがあります。メモ フラグメントのリストと、選択したメモを 2 番目のフラグメントに表示するためのメモ詳細フラグメントです。入力テキスト フィールド ( android:inputType="textMultiLine") があります。キーボードを非表示にしてイベントを処理したいので、ユーザーがキーボードを閉じたときに行った変更を保存できます。誰でもこのタスクを実行する手がかりを教えてもらえますか?

4

3 に答える 3

3

キーボードの問題に対する最善かつ普遍的な解決策は、レイアウトの変更時に VisibleDisplayFrame を測定することだと思います。

Rect visibleRect = new Rect();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ViewGroup mMain = (ViewGroup) inflater.inflate(R.layout.select_cover_album, container, false);

    mMain.getWindowVisibleDisplayFrame(visibleRect);
    mMain.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v,
                                       int left,
                                       int top,
                                       int right,
                                       int bottom,
                                       int oldLeft,
                                       int oldTop,
                                       int oldRight,
                                       int oldBottom) {

                Rect r = new Rect();
                mMain.getWindowVisibleDisplayFrame(r);

                if(r.height() < visibleRect.height()){
                    //keyboard shown

                }
                if(r.height() == visibleRect.height()){
                    //keyboard hidden
                }

            }
        });

        return mMain;
}
于 2016-03-09T11:10:55.713 に答える
2

Note Detailフラグメントでそれを処理する方法は次のとおりです。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    this.view = inflater.inflate(R.layout.fragment_note_detail_of_style_searching, container , false);

    listviewFilter = (ListView) view.findViewById(R.id.listview_filter);
    noteDetailView = view.findViewById(R.id.note_detail_of_style_view);
    photoDetailView = view.findViewById(R.id.gv_note_detail_photo);

    view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {                
            int heightDiff = view.getRootView().getHeight() - view.getHeight();
            if (heightDiff > 200) { 
                isWatchingKeyboard = true;
                photoDetailView.setVisibility(View.GONE);
                return; //must exit now
            }

            if(isWatchingKeyboard){
                isWatchingKeyboard = false;
                viewForFocus.requestFocus();
                photoDetailView.setVisibility(View.VISIBLE);
            }
        }
    });

    return this.view;
}
于 2012-10-25T06:39:06.317 に答える
0

私はこのようにしました:

private int prevBottom;

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_status, container, false);
    prevBottom = view.getBottom();

    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (view.getBottom() > prevBottom) {
                view.requestFocus();
            }
            prevBottom = view.getBottom();
        }
    });

    return view;
}

これを私が膨らませていたビューに追加しました:

android:focusableInTouchMode="true"

これを AndroidManifest.xml のアクティビティに

android:windowSoftInputMode="adjustResize"
于 2014-06-14T16:38:20.187 に答える