2011-06-07 12 views
25

मैं अपने तत्व नहीं प्राप्त कर सकता, उदाहरण के लिए ListView, ठीक से आकार बदलने के लिए।साइज चेंज में आकार और लेआउट कैसे सेट करें?

मुझे एक डैशबोर्ड, एक संपादन बॉक्स और एक सूचीदृश्य के साथ खोज के लिए ListActivity मिला। यह विचार है कि कुंजीपटल दिखाए जाने पर एक्शनबार को छिपाना है।

मैं LinearLayout बढ़ाया, आकार परिवर्तन देखने के लिए सुनने के लिए (अनुशंसित here के रूप में):

public class SizeChangingLinearLayout extends LinearLayout { 
    //... 
    @Override 
    protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) 
    {   
     View actionbar = mainView.findViewById(R.id.actionbar); 

     if (yNew > yOld) 
      actionbar.setVisibility(View.VISIBLE); 
     else if (yNew < yOld) 
      actionbar.setVisibility(View.GONE); 

     super.onSizeChanged(xNew, yNew, xOld, yOld); 

    } 
} 

छुपा/ActionBar के प्रदर्शन से काम करता है के रूप में उम्मीद लेकिन उनमें एक ही ऊंचाई की ListView नीचे के रूप में एक अंतर है छुपा एक्शनबार। जैसे ही कोई ग्राफिक्स बदलता है (उदा। संपादन बॉक्स में लिखना) ListView अंतर भरता है। कुंजीपटल छुपाते समय, एक समान व्यवहार विपरीत में दिखाई देता है।

enter image description here

[संपादित करें]

एक ही समस्या भी अन्य लेआउट बदलने में दिखाई देता है। onSizeChanged में Visibility बदलना सीधे दिखाता है, लेकिन आकार और मार्जिन बदलना तब तक प्रदर्शित नहीं होता जब तक कि कुछ अन्य उपयोगकर्ता कार्रवाई उन विचारों को दोबारा नहीं हटाती। अमान्यता onSizeChanged से काम नहीं करती है।

[/ संपादित करें]

मैं द्वारा ग्राफिक्स ताज़ा करने के लिए प्रयास किया है: आईएनजी दोनों कस्टम LinearLayout और

  • invalidateListView (here सिफारिश के रूप में)
  • पर notifyDataSetChanged सूची का एडाप्टर
  • forceLayout

... और अधिक सफलता के बिना। ListView पहले आकार क्यों नहीं बदल रहा है? क्या मुझे अपने विस्तारित लीनियरआउट में onLayout ओवरराइड करना है? मुझे क्या याद आया?

+0

नहीं किसी भी अद्यतन काम करता है, मैंने देखा है। "जैसे ही कोई ग्राफिक्स बदलता है", मैंने लिखा। लेकिन उदाहरण के लिए एक पॉपअप बदलावों को दिखाएगा नहीं। मुझे लगता है कि सही तत्वों को अमान्य किया जाना है, लेकिन वे नहीं करते हैं। – JOG

+0

समस्या सभी लेआउट परिवर्तनों के लिए भी प्रकट होती है, उदाहरण के लिए EditText के मार्जिन बदलना। लेकिन _adding_ लेआउट तत्व, उदाहरण के लिए बॉक्स के दाईं ओर एक बटन, हालांकि तुरंत दिखाता है। – JOG

उत्तर

32

onSizeChanged() के अंत में निम्नलिखित जोड़ने का समाधान होगा:

Handler handler = new Handler(); 
handler.post(new Runnable() { 

    @Override 
    public void run() { 
     requestLayout(); 
    } 
}); 

इस सवाल का जवाब देखें: Views inside a custom ViewGroup not rendering after a size change

+12

देखें एक पोस्ट() विधि है, इसलिए आपको हैंडलर आवंटित करने की आवश्यकता नहीं है। – ThomasW

+0

मैं 'ऑनसाइज चेंज' में बाल विचारों का आकार बदल रहा था, इसलिए मुझे 'requestLayout() 'कॉल करने से पहले चलाने योग्य बच्चे के विचारों का आकार बदलना पड़ा। –

0

यह एक लंबा शॉट हो सकता है ...

आप ListView के लिए android:layout_height="" सेटिंग के साथ खेल की कोशिश की है?

शायद match_parent या wrap_content का उपयोग कर यह काम करने के लिए मजबूर कर सकता है ...

जैसा कि मैंने कहा ... एक लंबे शॉट!

+0

बस @ प्रवीणसीजी के सुझाव की तरह, यह काम नहीं करता है। स्पष्ट रूप से किसी भी दृश्य पर 'ऑनसाइज चेंज' में कोई लेआउट परिवर्तन लागू नहीं किया जाता है जब तक कि कोई अन्य लेआउट अपडेट नहीं किया जाता है। – JOG

0

आप 1px से इसकी ऊंचाई बदल रहा है और

requestLayout()

+0

यह कोशिश की, और यह काम नहीं करता, दुर्भाग्य: 'setLayoutParams (। नई LayoutParams (LayoutParams.FILL_PARENT, (int) getResources() getDimension (R.dimen.another_value)));' ' requestLayout();' यह किसी भी अन्य लेआउट परिवर्तन के बाद ही नई ऊंचाई प्राप्त करता है। बस मेरे स्क्रीनशॉट की तरह। 'ऑनसाइज चेंज' विधि में हेरफेर करने का प्रयास करने वाले सभी दृश्यों पर वही व्यवहार भी दिखाई देता है। – JOG

0

बुला यह एक setOnFocusChangeListener और EditText करने के लिए एक setOnClickListener पंजीकरण करके आप क्या चाहते हैं करना संभव नहीं है द्वारा पुनः बनाने का ListView मजबूर कर सकते हैं।

नेविगेशन की बात करते समय विचार करने के लिए कई अलग-अलग परिदृश्य हैं और कुछ निश्चित लेआउट के साथ काम करने के लिए चीजों को बदलने की आवश्यकता हो सकती है।

वैसे भी, बैक बटन स्पर्श होने पर छुपा तत्व दिखाने के लिए आकार बदलें पर ओवरराइड करना प्रारंभ करें।

public class MyLinearLayout extends LinearLayout { 

    private MyListActivity mMyListActivity; 

    public MyLinearLayout(Context context) { 
     super(context); 
    } 

    public MyLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs);  
    } 

    public void setMyListActivity(MyListActivity mla) { 
     mMyListActivity = mla; 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     // show the element when we get more room  
     if (h > oldh) { 
      if (mMyListActivity != null) { 
       mMyListActivity.showBar(); 
      } 
     } 
     super.onSizeChanged(w, h, oldw, oldh); 
    } 
} 

ListActivity हम MyLinearLayout हड़पने और इसे करने के लिए this गुजरती हैं। फिर एक setOnFocusChangeListener एडिटटेक्स्ट का फ़ोकस बदलते समय चीजों को संभालने के लिए पंजीकृत है। SetOnClickListener का उपयोग तत्व को छिपाने के लिए किया जाता है जब EditText पहले से ही फोकस करता है।

public class MyListActivity extends ListActivity { 

    private ArrayList<MyData> mDataList = new ArrayList<MyData>(); 

    private MyLinearLayout mMyLinearLayout; 
    private LinearLayout mHideMeLinearLayout; 
    private EditText mEditText; 

    public void showBar() { 
     if (mHideMeLinearLayout != null) { 
      mHideMeLinearLayout.setVisibility(View.VISIBLE); 
     } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Get MyLinearLayout and pass this to it. 
     mMyLinearLayout = (MyLinearLayout) findViewById(R.id.myLinearLayout); 
     mMyLinearLayout.setMyListActivity(this); 

     // the LinearLayout to be hidden 
     mHideMeLinearLayout = (LinearLayout) findViewById(R.id.LinearLayoutToHide); 

     mEditText = (EditText) findViewById(R.id.editText);  
     mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); 
       if (hasFocus) { 
        imm.showSoftInput(mEditText, 0); 
        mHideMeLinearLayout.setVisibility(View.GONE); 
       } else { 
        imm.hideSoftInputFromWindow(mMyLinearLayout.getWindowToken(), 0); 
        mHideMeLinearLayout.setVisibility(View.VISIBLE); 
       } 
      } 
     }); 
     mEditText.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mHideMeLinearLayout.setVisibility(View.GONE); 
      } 
     }); 

     ..... 
    } 

    ..... 
} 

मैं बाद में एक उदाहरण उदाहरण प्रदान करूंगा, लेकिन अब इसे चलाना होगा।

संबंधित मुद्दे