2012-03-07 4 views
7

Khi viết trong Textfield, tôi cần trường văn bản của mình di chuyển lên trên để cho trường văn bản hiển thị khi bàn phím bật lên.Làm cách nào để phát hiện bàn phím libgdx

libgdx có phương pháp nào trả về true nếu bàn phím có thể nhìn thấy và giả khi nó bị hỏng không?

+0

thể trùng lặp của [Detect nếu bàn phím mềm xuất hiện trên màn hình] (http://stackoverflow.com/questions/4745988/ phát hiện-nếu-mềm-bàn phím-là-có thể nhìn thấy trên màn hình) –

+0

Điều này không có gì để làm với libgdx, bạn muốn nghe cho một sự kiện Android bản địa.Câu hỏi này đã được hỏi và trả lời –

+3

Kinda, nhưng nếu nó không được cung cấp bởi LibGDX, nỗ lực thực hiện để nghe sự kiện này là lớn hơn nhiều;). – dom

Trả lời

1

Hãy thử

Gdx.input.isPeripheralAvailable(Input.Peripheral.OnscreenKeyboard); 

Tôi chỉ nhìn này trong các tài liệu, không biết nếu nó thực hiện các trick. Nhưng phương pháp

Gdx.input.setOnscreenKeyboardVisible(boolean visible); 

cũng có thể được sử dụng (như bạn xác định khi bàn phím hiển thị và khi nào không hiển thị).

+0

Đã thử Input.Peripheral.OnscreenKeyboard, nhưng nó luôn luôn đúng khi chạy ứng dụng trên android. Nhưng tôi sẽ cố gắng tự làm điều đó, cảm ơn cho các tip :) –

+1

Nếu không, như Andrei Bodnarescu đề nghị, bạn luôn có thể lắng nghe cho các sự kiện như được mô tả trong http://stackoverflow.com/questions/4745988/detect-if-soft -keyboard-is-visible-on-screen, sử dụng cấu trúc giống như tôi đã mô tả trong http://stackoverflow.com/questions/9584959/using-sqlite-from-libgdx-on-android/9590715#9590715. Chúc mừng! – dom

+0

Có vẻ như luôn quay trở lại đúng không? – JohnyTex

12

Mã sau sẽ phát hiện khi bạn nhấn một trường văn bản, ngăn không cho nó hiển thị bàn phím và sau đó mở hộp thoại gốc di chuyển lên và xuống bằng bàn phím. Nó sẽ lấy đầu vào từ hộp thoại gốc và cuối cùng đưa nó trở lại trong textField của bạn:

textField.setOnscreenKeyboard(new TextField.OnscreenKeyboard() { 
     @Override 
     public void show(boolean visible) { 
      //Gdx.input.setOnscreenKeyboardVisible(true); 
      Gdx.input.getTextInput(new Input.TextInputListener() { 
       @Override 
       public void input(String text) { 
        textField.setText(text); 
       } 

       @Override 
       public void canceled() { 
        System.out.println("Cancelled."); 
       } 
      }, "Title", "Default text..."); 
     } 
    }); 

Chúc may mắn!

+1

Bất kỳ ý tưởng nào về cách chúng tôi thay đổi kiểu của hộp thoại gốc này? –

+1

Không. Tôi đoán bạn không thể làm điều đó bởi vì nó sẽ khác nhau giữa Android và iPhone và máy tính để bàn Java, v.v. Tóm lại: Bản địa của nó => Công trình của nó nguyên bản! – JohnyTex

+0

Tuyệt vời, cảm ơn câu trả lời đó! – middlehut

7

Tôi biết tôi đang trả lời một chuỗi cũ, nhưng tôi đã googling để tìm câu trả lời cho câu hỏi này nhưng không thể tìm thấy câu trả lời ở bất cứ đâu. Bây giờ tôi đã tự tạo ra một giải pháp. Đây là cách để làm điều đó trên Android một cách thanh lịch :) Tôi đang tạo một ApplicationBundle để kết nối các giao diện để thêm các nền tảng cụ thể. Bạn cũng có thể làm điều này trên iOS nếu bạn muốn sử dụng RoboVM.

Giải pháp của tôi:

tạo một giao diện SizeChangeListener trong dự án cốt lõi:

public interface SizeChangeListener { 
    public void onSizeChange(float width, float height); 
} 

tạo Xem giao diện trong dự án cốt lõi:

public interface View { 
    public void onSizeChange(float width, float height); 
    public void addListener(SizeChangeListener sizeChangeListener); 
    public float getWidth(); 
    public float getHeight(); 
} 

tạo AndroidView thực hiện Xem giao diện :

public class AndroidView implements View { 

    private ArrayList<SizeChangeListener> listeners = new ArrayList<SizeChangeListener>(); 
    private float width, height; 
    public AndroidView(int width, int height) { 
     this.width = width; 
     this.height = height; 
    } 

    public void addListener(SizeChangeListener listener) { 
     listeners.add(listener); 
    } 

    public void onSizeChange(float width, float height) { 
     this.width = width; 
     this.height = height; 
     for(SizeChangeListener listener : listeners) 
      listener.onSizeChange(width, height); 
    } 

    public float getWidth() { 
     return width; 
    } 

    public float getHeight() { 
     return height; 
    } 

} 

tạo ApplicationBundle trong dự án cốt lõi

public class ApplicationBundle { 

    private final View view; 

    public ApplicationBundle(View view) { 
     this.view = view; 
    } 

    public View getView() { 
     return view; 
    } 
} 

Hãy nhập khẩu cần thiết từ các dự án cốt lõi. Trong AndroidLauncher trong dự án Android thêm như sau:

public class AndroidLauncher extends AndroidApplication { 

    private View rootView; 
    private AndroidView androidView; 
    private int width, height; 

    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); 
     rootView = this.getWindow().getDecorView().getRootView(); 
     Rect rect = new Rect(); 
     rootView.getWindowVisibleDisplayFrame(rect); 
     width = rect.width(); 
     height = rect.height(); 
     androidView = new AndroidView(width, height); 

     rootView.addOnLayoutChangeListener(new OnLayoutChangeListener() { 

      @Override 
      public void onLayoutChange(View v, int left, int top, int right, 
        int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 

       Rect rect = new Rect(); 
       rootView.getWindowVisibleDisplayFrame(rect); 

       if(!(width == rect.width() && height == rect.height())) { 
        width = rect.width(); 
        height = rect.height(); 
        androidView.onSizeChange(width, height); 
       } 
      } 

     }); 

     initialize(new DigMeApp(new ApplicationBundle(androidView)), config); 
    } 
} 

trong MyApp chính của bạn trong dự án cốt lõi trong phương pháp tạo() thêm một thi SizeChangeListener để xem bạn đã nhận được từ các nhà xây dựng.

public class MyApp extends Game { // or ApplicationAdapter 
    private View view; 
    private Stage stage; 
    // your own variables 

    public MyApp(ApplicationBundle applicationBundle) { 
     view = applicationBundle.getView(); 
    } 

    @Override 
    public void create() { 
     stage = new Stage(); 
     // add some textfields 
    final TextField tf1 = new TextField("", skin); 
    final TextField tf2 = new TextField("", skin); 

    tf1.setWidth((float)view.getWidth() * 0.6f); 
    tf2.setWidth((float)view.getWidth() * 0.6f); 
    tf1.setHeight((float)view.getHeight() * 0.05f); 
    tf2.setHeight((float)view.getHeight() * 0.05f); 
     view.addListener(new SizeChangeListener() {   
      @Override 
      public void onSizeChange(float width, float height) { 
       Gdx.app.log("INFO", "Visible area: " + width + " " + height); 
       Gdx.app.log("INFO", "Stage area: " + stage.getWidth() + " " + stage.getHeight()); 
       float keyboardHeight = getKeyboardHeight(); 

// MOVE THEM OUT OF THE WAY :) 

       tf1.addAction(Actions.moveTo(width/2 - tf1.getWidth()/2.0f, keyboardHeight + (6 * (height/8)), 1, Interpolation.sineOut)); 
       tf2.addAction(Actions.moveTo(width/2 - tf2.getWidth()/2.0f, keyboardHeight + (7 * (height/8)), 1, Interpolation.sineOut)); 


//    Gdx.gl20. 
//    tf.setPosition(width/2 - (tf.getWidth()/2.0f), 0); 
      } 
     }); 
} 

Có lẽ tạo ra một chút phương pháp bàn phím heigt như tôi đã làm:

private float getKeyboardHeight() { 
     return stage.getHeight() - view.getHeight(); 
    } 
+0

Tôi thích câu trả lời này, nó hoạt động rất tốt trên tất cả các thiết bị tôi đã thử nghiệm nó trên. Bình luận duy nhất tôi sẽ thực hiện là 'view.getHeight()' cần được thu nhỏ để phù hợp với kích thước sân khấu hoặc máy ảnh nếu bạn đã buộc libgdx là một độ phân giải cụ thể. @Willempie bạn có giải pháp làm việc cho iOS không? – hamham

+0

Đây là một câu trả lời tuyệt vời, hoạt động thực sự tốt, và may mắn là tôi không phải thực hiện cách iOS để không phải là vấn đề. Đây sẽ là câu trả lời được lựa chọn, mặc dù tôi có một báo trước. Khi tôi chạm vào một trường văn bản, khi bàn phím xuất hiện, biểu ngữ màu đen ở đầu ứng dụng của tôi có tên ứng dụng của tôi trong đó. Nó có vẻ là xuống dòng 'rootView = this.getWindow(). GetDecorView(). GetRootView();' bất kỳ ý tưởng nào để tránh điều này? –

+0

[SOLVED] 'this.requestWindowFeature (Window.FEATURE_NO_TITLE);' Tôi đã thêm dòng này trước khi rootView được đặt –