2014-10-15 5 views
6

मुझे एक डायलॉगफ्रैगमेंट मिला है, जो आम तौर पर स्क्रीन पर केंद्रित होता है, कि यदि कोई दिखाना चाहिए, तो मैं ऑन-स्क्रीन कीबोर्ड के रास्ते से बाहर निकलने की कोशिश कर रहा हूं, क्योंकि यह एक अच्छा यूएक्स अनुभव नहीं है खिड़की के हिस्सों पर कवर करने के लिए कुंजीपटल जब पूरी तरह अप्रयुक्त स्क्रीन अचल संपत्ति दूर है।एनिमेट विंडो लेआउट बदलें

मान लीजिए कि मैंने कीबोर्ड को प्रकट करने या गायब होने का पता लगाने की समस्या हल कर दी है, उदा। How to check visibility of software keyboard in Android?

वर्तमान में मैं कुछ इस तरह करने से रास्ते से बाहर खिड़की स्थानांतरित करने के लिए जाना:

... 
final WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); 
params.gravity = Gravity.TOP; 
params.verticalMargin = .1f; //or whatever 
dialog.getWindow().setAttributes(params); 
... 

यह ठीक काम करता है, लेकिन खिड़की अचानक जगह है, जो एक सुखद UX अनुभव नहीं है में झटके। प्रश्न में खिड़की में एक सफल प्रवेश और निकास एनीमेशन है - और यह विंडो लेआउट परिवर्तन के बाद भी उचित रूप से काम करता है। मैं WindowManager के बीच विंडो को और कैसे एनिमेट कर सकता हूं। LayoutParams में परिवर्तन?

(मैं http://developer.android.com/reference/android/view/Window.html बजाय, कहते हैं {भीतर} यदि संभव हो तो {} के लेआउट के संदर्भ में काम कर रखना चाहते हैं /, मेरी गतिविधि के लेआउट में DialogFragment मजबूर और वहाँ के भीतर से यह एनिमेट)।

+1

अपने AndroidManifest में, आप 'एंड्रॉयड जोड़ने की कोशिश की है: windowSoftInputMode =" stateHidden | adjustPan "' अपनी गतिविधि टैग के लिए? वह स्वचालित रूप से दिखाए गए सक्रिय दृश्य को रखने में सक्षम हो सकता है। मैं इसे अन्य सुविधाओं के लिए उपयोग करता हूं, लेकिन डायलॉग फ्रैगमेंट के साथ प्रयास नहीं किया है। – Anonsage

+1

मैंने पहले ऐसा करने की कोशिश की थी, और मैंने इसे फिर से सुनिश्चित करने की कोशिश की। ऐसा लगता है कि गतिविधि रूट व्यू (सजावट दृश्य) को प्रभावित करता है, न कि किसी भी अन्य विंडोज़ और उनके विचार। मैं पृष्ठभूमि में कुंजीपटल के लिए गतिविधि समायोजित करता हूं (और एनीमेशन के बिना भी, आपको दिमाग में), लेकिन खिड़की बस अपरिवर्तित तैरती है। इसके अलावा, अगर किसी और को इसका सुझाव देने का लुत्फ उठाया जाता है, तो हाँ मैंने "window.setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) भी कोशिश की है;" डायलॉग फ्रैगमेंट में ही। – jdowdell

+0

@jdowdell इसके बजाय 'संवाद प्लग' का उपयोग करें। –

उत्तर

2

मेरे पास बक्षीस की समयसीमा समाप्त होने का इंतजार करने का समय नहीं था, इसलिए मैंने नीचे दिए गए स्टॉप गैप को कोड किया जब तक कि मैं बेहतर समाधान नहीं प्राप्त कर सकता। अगर यह किसी और की मदद करता है, या उन्हें एक बक्षीस योग्य उत्तर के लिए एक विचार देता है, तो मैंने यही किया। हालांकि, मुझे लगता है कि यह सभी नरक के रूप में अक्षम है, क्योंकि मुझे लगता है कि यह स्क्रीन पर एक बिटमैप को पैन करने की बजाय प्रत्येक एनीमेशन फ्रेम को एक विंडो को रिलेआउट करता है। बेशक यह सब नहीं है, लेकिन महत्वपूर्ण बिट है:

// Not shown: setting currentVerticalMargin, targetVerticalMargin, or calling this method 
private synchronized void restartVerticalMarginAnimator() { 
    if (verticalMarginAnimator != null) { 
     return; 
    } 
    final Dialog dialog = this.getDialog(); 
    if (dialog == null) { 
     return; 
    } 
    final WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); 
    verticalMarginAnimator = new TimeAnimator(); 
    verticalMarginAnimator.setTimeListener(new TimeListener() { 
     @Override 
     public void onTimeUpdate(TimeAnimator a, long totalTime, long deltaTime) { 
      float stretch = targetVerticalMargin - currentVerticalMargin; 
      float distance = WINDOW_ANIMATION_SPEED * deltaTime/1000L; 
      boolean finished = false; 

      // Adjust distance so it's capped at "going all the way to target" and no further, 
      // and has the right sign if we're animating upward. 
      if (distance > Math.abs(stretch)) { 
       distance = stretch; 
       finished = true; 
      } else if (stretch < 0) { 
       distance *= -1f; 
      } 

      // Move. 
      currentVerticalMargin += distance; 
      if (finished) { 
       verticalMarginAnimator.end(); 
       verticalMarginAnimator = null; 
      } 
      params.verticalMargin = currentVerticalMargin; 
      dialog.getWindow().setAttributes(params); 
     } 
    }); 
    verticalMarginAnimator.start(); 
} 
संबंधित मुद्दे