浏览代码

Revert "Move PopupWindow logic to GodotEditText on Android"

Fredia Huya-Kouadio 5 年之前
父节点
当前提交
04b402b6f1

+ 40 - 5
platform/android/java/lib/src/org/godotengine/godot/Godot.java

@@ -56,6 +56,8 @@ import android.content.SharedPreferences.Editor;
 import android.content.pm.ConfigurationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.Point;
+import android.graphics.Rect;
 import android.hardware.Sensor;
 import android.hardware.SensorEvent;
 import android.hardware.SensorEventListener;
@@ -68,6 +70,7 @@ import android.os.VibrationEffect;
 import android.os.Vibrator;
 import android.provider.Settings.Secure;
 import android.view.Display;
+import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -75,10 +78,12 @@ import android.view.Surface;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
+import android.view.ViewTreeObserver;
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.Button;
 import android.widget.FrameLayout;
+import android.widget.PopupWindow;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
@@ -160,7 +165,7 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
 	public GodotRenderView mRenderView;
 	private boolean godot_initialized = false;
 
-	private GodotEditText mEditText;
+	private PopupWindow mKeyboardWindow;
 
 	private SensorManager mSensorManager;
 	private Sensor mAccelerometer;
@@ -218,6 +223,24 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
 		containerLayout = new FrameLayout(activity);
 		containerLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
 
+		// Create a popup window with an invisible layout for the virtual keyboard,
+		// so the view can be resized to get the vk height without resizing the main godot view.
+		final FrameLayout keyboardLayout = new FrameLayout(activity);
+		keyboardLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+		keyboardLayout.setVisibility(View.INVISIBLE);
+		mKeyboardWindow = new PopupWindow(keyboardLayout, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+		mKeyboardWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
+		mKeyboardWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
+		mKeyboardWindow.setFocusable(true); // for the text edit to work
+		mKeyboardWindow.setTouchable(false); // inputs need to go through
+
+		// GodotEditText layout
+		GodotEditText editText = new GodotEditText(activity);
+		editText.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+		editText.setKeyboardView(keyboardLayout);
+		// ...add to keyboard layout
+		keyboardLayout.addView(editText);
+
 		GodotLib.setup(command_line);
 
 		final String videoDriver = GodotLib.getGlobal("rendering/quality/driver/driver_name");
@@ -230,9 +253,21 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
 
 		View view = mRenderView.getView();
 		containerLayout.addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+		editText.setView(mRenderView);
+		io.setEdit(editText);
 
-		mEditText = new GodotEditText(activity, mRenderView);
-		io.setEdit(mEditText);
+		keyboardLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+			@Override
+			public void onGlobalLayout() {
+				Point fullSize = new Point();
+				activity.getWindowManager().getDefaultDisplay().getSize(fullSize);
+				Rect gameSize = new Rect();
+				mKeyboardWindow.getContentView().getWindowVisibleDisplayFrame(gameSize);
+
+				final int keyboardHeight = fullSize.y - gameSize.bottom;
+				GodotLib.setVirtualKeyboardHeight(keyboardHeight);
+			}
+		});
 
 		mRenderView.queueOnRenderThread(new Runnable() {
 			@Override
@@ -591,14 +626,14 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
 		mRenderView.getView().post(new Runnable() {
 			@Override
 			public void run() {
-				mEditText.onInitView();
+				mKeyboardWindow.showAtLocation(getActivity().getWindow().getDecorView(), Gravity.NO_GRAVITY, 0, 0);
 			}
 		});
 	}
 
 	@Override
 	public void onDestroy() {
-		mEditText.onDestroyView();
+		mKeyboardWindow.dismiss();
 
 		for (GodotPlugin plugin : pluginRegistry.getAllPlugins()) {
 			plugin.onMainDestroy();

+ 27 - 51
platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java

@@ -32,27 +32,17 @@ package org.godotengine.godot.input;
 
 import org.godotengine.godot.*;
 
-import android.app.Activity;
 import android.content.Context;
-import android.graphics.Point;
-import android.graphics.Rect;
 import android.os.Handler;
 import android.os.Message;
 import android.text.InputFilter;
 import android.text.InputType;
 import android.util.AttributeSet;
-import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewTreeObserver;
-import android.view.WindowManager;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
-import android.widget.FrameLayout;
-import android.widget.PopupWindow;
 
 import java.lang.ref.WeakReference;
 
@@ -68,7 +58,6 @@ public class GodotEditText extends EditText {
 	// ===========================================================
 	private GodotRenderView mRenderView;
 	private View mKeyboardView;
-	private PopupWindow mKeyboardWindow;
 	private GodotTextInputWrapper mInputWrapper;
 	private EditHandler sHandler = new EditHandler(this);
 	private String mOriginText;
@@ -93,52 +82,24 @@ public class GodotEditText extends EditText {
 	// ===========================================================
 	// Constructors
 	// ===========================================================
-	public GodotEditText(final Context context, final GodotRenderView view) {
+	public GodotEditText(final Context context) {
 		super(context);
+		initView();
+	}
 
-		setPadding(0, 0, 0, 0);
-		setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE);
-		setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
-
-		mRenderView = view;
-		mInputWrapper = new GodotTextInputWrapper(mRenderView, this);
-		setOnEditorActionListener(mInputWrapper);
-		view.getView().requestFocus();
-
-		// Create a popup window with an invisible layout for the virtual keyboard,
-		// so the view can be resized to get the vk height without resizing the main godot view.
-		final FrameLayout keyboardLayout = new FrameLayout(context);
-		keyboardLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
-		keyboardLayout.setVisibility(View.INVISIBLE);
-		keyboardLayout.addView(this);
-		mKeyboardView = keyboardLayout;
-
-		mKeyboardWindow = new PopupWindow(keyboardLayout, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
-		mKeyboardWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
-		mKeyboardWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
-		mKeyboardWindow.setFocusable(true); // for the text edit to work
-		mKeyboardWindow.setTouchable(false); // inputs need to go through
-
-		keyboardLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
-			@Override
-			public void onGlobalLayout() {
-				Point fullSize = new Point();
-				((Activity)mRenderView.getView().getContext()).getWindowManager().getDefaultDisplay().getSize(fullSize);
-				Rect gameSize = new Rect();
-				mKeyboardWindow.getContentView().getWindowVisibleDisplayFrame(gameSize);
-
-				final int keyboardHeight = fullSize.y - gameSize.bottom;
-				GodotLib.setVirtualKeyboardHeight(keyboardHeight);
-			}
-		});
+	public GodotEditText(final Context context, final AttributeSet attrs) {
+		super(context, attrs);
+		initView();
 	}
 
-	public void onInitView() {
-		mKeyboardWindow.showAtLocation(mRenderView.getView(), Gravity.NO_GRAVITY, 0, 0);
+	public GodotEditText(final Context context, final AttributeSet attrs, final int defStyle) {
+		super(context, attrs, defStyle);
+		initView();
 	}
 
-	public void onDestroyView() {
-		mKeyboardWindow.dismiss();
+	protected void initView() {
+		setPadding(0, 0, 0, 0);
+		setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE);
 	}
 
 	public boolean isMultiline() {
@@ -192,6 +153,21 @@ public class GodotEditText extends EditText {
 		p_edit_text.setFilters(filters);
 	}
 
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+	public void setView(final GodotRenderView view) {
+		mRenderView = view;
+		if (mInputWrapper == null)
+			mInputWrapper = new GodotTextInputWrapper(mRenderView, this);
+		setOnEditorActionListener(mInputWrapper);
+		view.getView().requestFocus();
+	}
+
+	public void setKeyboardView(final View keyboardView) {
+		mKeyboardView = keyboardView;
+	}
+
 	// ===========================================================
 	// Methods for/from SuperClass/Interfaces
 	// ===========================================================