0

環境

ユーザーがアクティビティ内のカードビューの名前をすばやく変更できるように、popupwindows を使用しています。

これを行うには、a を使用して(元の名前) を(新しい名前)ViewSwitcherに交換します。TextViewEditText

問題

確認するEditTextPopUpWindowが表示され、ユーザーが を押す"RECENT APPS"と、何らかの理由でアプリに戻ることができません。すなわち。クリックしても反応しません。

診断

Window Focus の問題だと思います。私はEditText.clearFocus()ET から試して、すべての PopUps を却下しましたonPauseが、うまくいきません。

この問題を解決するために onFocusChangeListener を使用する方法はありますか?

コード(余分な項目を可能な限り削除しようとしました)

TheHubActivity.java

public class TheHubActivity extends AppCompatActivity implements RecyclerViewAdapter.onCardClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // KEYBOARD
        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        //... Set up recycle view

        rvContent = new ArrayList<>();
    }

    @Override
    public void onCardLongClick(Flow longClickedFlow, int cardPosition, View cardViewClicked) {
        showLongClickPopUpMenu(longClickedFlow,cardPosition, cardViewClicked);
    }

    private void showLongClickPopUpMenu(final Flow longClickedFlow, final int cardPosition, final View cardViewClicked) {

        LayoutInflater layoutInflater = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout = layoutInflater.inflate(R.layout.popup_window_longclick, null);

        LinearLayout viewGroup = (LinearLayout)  layout.findViewById(R.id.popup_longclick);

        // Creating the PopupWindow
        final PopupWindow popup = new PopupWindow(layout, RecyclerView.LayoutParams.WRAP_CONTENT,
                RecyclerView.LayoutParams.WRAP_CONTENT);


        popup.setFocusable(true);

        // Getting a reference to Close button, and close the popup when clicked.
        ImageView delete = (ImageView) layout.findViewById(R.id.popup_delete_item);

        delete.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                /*.... Delete current Flow from internal file and UI */
                popup.dismiss();
            }
        });

        ImageView edit = (ImageView) layout.findViewById(R.id.popup_edit_item);

        edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popup.dismiss();
                renameFlow(cardPosition, cardViewClicked);
            }
        });

        // Displaying the popup at the specified location, + offsets.
        popup.showAsDropDown(cardViewClicked, cardViewClicked.getMeasuredWidth(),popupDisplayHeight, Gravity.TOP);

        longClickPopup = popup;
    }

    private void renameFlow(final int cardPosition, final View cardViewClicked) {
        final ViewSwitcher switcher = (ViewSwitcher) cardViewClicked.findViewById(R.id.rename_switcher);
        final EditText rename = (EditText) switcher.findViewById(R.id.item_flow_rename);

        rename.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (rename.hasFocus()) {
                    showEditPopupWindow(rename, cardViewClicked, switcher, cardPosition);
                } else {
                    imm.hideSoftInputFromWindow(rename.getWindowToken(), 0);
                }

            }
        });

        switcher.showNext();

        rename.requestFocus();
        imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY);
        /* Forces keyboard */


    }

    private void showEditPopupWindow(final EditText newName, View cardViewClicked, final ViewSwitcher switcher, final int cardPosition) {
        LayoutInflater layoutInflater = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout = layoutInflater.inflate(R.layout.popup_window_editing, null);

        LinearLayout viewGroup = (LinearLayout)  layout.findViewById(R.id.popup_editing);

        // Creating the PopupWindow
        final PopupWindow popup = new PopupWindow(layout, RecyclerView.LayoutParams.WRAP_CONTENT,
                RecyclerView.LayoutParams.WRAP_CONTENT);

        popup.setFocusable(false); // So that user can edit text

        // Getting a reference to Close button, and close the popup when clicked.
        ImageView confirmEdit = (ImageView) layout.findViewById(R.id.popup_confirm_item_changes);

        confirmEdit.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                /* .. Changes name of cardview through edit text */
                    switcher.showNext();
                    popup.dismiss();
                    newName.clearFocus();
                }

            }
        });

        ImageView cancelEdit = (ImageView) layout.findViewById(R.id.popup_cancel_item_changes);

        cancelEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switcher.showNext();
                popup.dismiss();
            }
        });

        popup.showAsDropDown(cardViewClicked, cardViewClicked.getMeasuredWidth(),popupDisplayHeight, Gravity.TOP);
        editingPopup = popup;
    }


    @Override
    protected void onPause() {
        dismissPopups();
        super.onPause();
    }

    private void dismissPopups() {
        if (longClickPopup!=null && longClickPopup.isShowing()) {
            longClickPopup.dismiss();
        }

        if (editingPopup!=null && editingPopup.isShowing()) {
            editingPopup.dismiss();
        }
    }
}

視覚的な人向け

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

0

私は問題を解決しました...そして、それは驚くほど大きく、Focus / PopUpsとはまったく関係がありませんでした(トンネルビジョンはそうです)。

私のマニフェストではandroid:launchMode="singleTop"、TheHubActivity が最近のアプリに送信されたときに奇妙な動作を作成していました。これは私の入り口のアクティビティだったからです。Developer Docs singleTop 関数から次のようにします。

同様に、「singleTop」アクティビティの新しいインスタンスを作成して、新しいインテントを処理することもできます。ただし、ターゲット タスクのスタックの最上位に既にアクティビティの既存のインスタンスがある場合、そのインスタンスは (onNewIntent() 呼び出しで) 新しいインテントを受け取ります。新しいインスタンスは作成されません。その他の状況 - たとえば、"singleTop" アクティビティの既存のインスタンスがターゲット タスクにあるがスタックの一番上にない場合、またはスタックの一番上にあるがターゲット タスクにない場合 -新しいインスタンスが作成され、スタックにプッシュされます。

<activity
            android:name=".TheHubActivity"
            android:label="@string/app_name"
            ~~~~~~android:launchMode="singleTop"~~~~~~~~
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
于 2016-08-21T20:22:02.520 に答える