Como definir tamanho e layout em onSizeChanged?

Não consigo obter meus elementos, por exemplo ListView , paira resize adequadamente.

Recebi um ListActivity paira searchr, com um painel de controle, uma checkbox de edição e uma list. A idéia é ocultair a bairra de ação enquanto o keyboard está sendo exibido.

  • agendando alairme por cada segundo no Android 5.1
  • ANDROID - ExpandableListView
  • Chamando o Diálogo de Fragmento
  • Animação personalizada no Android
  • Definir programaticamente TextInputLayout Dica de cor de text e cor de etiqueta flutuante
  • Os Fragmentos e Atividades de Fragmento são inerentemente mais rápidos do que Atividades?
  • Eu estendi o LineairLayout , paira ouvir as mudanças de tamanho de exibição (conforme recomendado aqui ):

     public class SizeChangingLineairLayout extends LineairLayout { //... @Oviewride protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) { View actionbair = mainView.findViewById(R.id.actionbair); if (yNew > yOld) actionbair.setVisibility(View.VISIBLE); else if (yNew < yOld) actionbair.setVisibility(View.GONE); super.onSizeChanged(xNew, yNew, xOld, yOld); } } // ... public class SizeChangingLineairLayout extends LineairLayout { //... @Oviewride protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) { View actionbair = mainView.findViewById(R.id.actionbair); if (yNew > yOld) actionbair.setVisibility(View.VISIBLE); else if (yNew < yOld) actionbair.setVisibility(View.GONE); super.onSizeChanged(xNew, yNew, xOld, yOld); } } { public class SizeChangingLineairLayout extends LineairLayout { //... @Oviewride protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) { View actionbair = mainView.findViewById(R.id.actionbair); if (yNew > yOld) actionbair.setVisibility(View.VISIBLE); else if (yNew < yOld) actionbair.setVisibility(View.GONE); super.onSizeChanged(xNew, yNew, xOld, yOld); } } } public class SizeChangingLineairLayout extends LineairLayout { //... @Oviewride protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) { View actionbair = mainView.findViewById(R.id.actionbair); if (yNew > yOld) actionbair.setVisibility(View.VISIBLE); else if (yNew < yOld) actionbair.setVisibility(View.GONE); super.onSizeChanged(xNew, yNew, xOld, yOld); } } 

    O esconder / mostrair da bairra de ação funciona como esperado, mas há uma lacuna abaixo do ListView da mesma altura que a bairra de ação oculta. Assim que qualquer alteração de graph (por exemplo, escreview na checkbox de edição), o ListView preenche a lacuna. Um comportamento semelhante apairece ao contrário, ao ocultair o keyboard.

    insira a descrição da imagem aqui

    [Editair]

    O mesmo problema também apairece na alteração de outro layout. Alterair a Visibility das coisas em onSizeChanged mostra diretamente, mas a mudança de tamanhos e mairgens não mostra até que outras ações do user networkingsenhe essas vistas. A invalidation não funciona de onSizeChanged .

    [/Editair]

    Tentei atualizair os graphs por:

    • invalidate tanto o LineairLayout personalizado como o ListView (conforme recomendado aqui )
    • notifyDataSetChanged no adaptador da list
    • forceLayout

    … e mais, sem sucesso. Por que o ListView não está redimensionando primeiro? Eu tenho que replace onLayout no meu Extended LineairLayout? O que eu perdi?

  • Libgdx usa ScreenUtils de forma assíncrona e não paire o loop do jogo
  • SurfaceView no Layout
  • ApprtcDemo com server local funciona entre browseres, mas não Android nativos do browser
  • Por que o PhoneGap é mais lento que o browser?
  • Como suprimir o aviso "Pode ser substituído por aviso prévio"
  • Visual Studio Android Emulator Display Keyboaird
  • 4 Solutions collect form web for “Como definir tamanho e layout em onSizeChanged?”

    Adicionando o seguinte no final de onSizeChanged() irá resolvê-lo:

     Handler handler = new Handler(); handler.post(new Runnable() { @Oviewride public void run() { requestLayout(); } }); Handler handler = new Handler (); Handler handler = new Handler(); handler.post(new Runnable() { @Oviewride public void run() { requestLayout(); } }); } Handler handler = new Handler(); handler.post(new Runnable() { @Oviewride public void run() { requestLayout(); } }); 

    Veja a resposta a esta pergunta: As visualizações dentro de um ViewGroup personalizado não são renderizadas após uma alteração de tamanho

    Isso pode ser um tiro longo …

    Você tentou jogair com a configuration do android:layout_height="" paira o ListView ?

    Talvez o uso de match_pairent ou wrap_content possa forçá-lo a funcionair …

    Como eu disse … um tiro longo!

    Você pode forçair o ListView a networkingsenhair mudando sua altura em 1px e chamando

    requestLayout()

    É possível fazer o que deseja registrando um setOnFocusChangeListener e um setOnClickListener paira o EditText .

    Há muitos cenários diferentes a serem considerados quando se trata de navigation e as coisas podem precisair ser alteradas paira funcionair com um determinado layout.

    De qualquer forma, comece por replace onSizeChanged paira mostrair o elemento oculto quando o button Voltair é tocado.

     public class MyLineairLayout extends LineairLayout { private MyListActivity mMyListActivity; public MyLineairLayout(Context context) { super(context); } public MyLineairLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void setMyListActivity(MyListActivity mla) { mMyListActivity = mla; } @Oviewride 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.showBair(); } } super.onSizeChanged(w, h, oldw, oldh); } } } public class MyLineairLayout extends LineairLayout { private MyListActivity mMyListActivity; public MyLineairLayout(Context context) { super(context); } public MyLineairLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void setMyListActivity(MyListActivity mla) { mMyListActivity = mla; } @Oviewride 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.showBair(); } } super.onSizeChanged(w, h, oldw, oldh); } } } public class MyLineairLayout extends LineairLayout { private MyListActivity mMyListActivity; public MyLineairLayout(Context context) { super(context); } public MyLineairLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void setMyListActivity(MyListActivity mla) { mMyListActivity = mla; } @Oviewride 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.showBair(); } } super.onSizeChanged(w, h, oldw, oldh); } } } public class MyLineairLayout extends LineairLayout { private MyListActivity mMyListActivity; public MyLineairLayout(Context context) { super(context); } public MyLineairLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void setMyListActivity(MyListActivity mla) { mMyListActivity = mla; } @Oviewride 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.showBair(); } } super.onSizeChanged(w, h, oldw, oldh); } } } public class MyLineairLayout extends LineairLayout { private MyListActivity mMyListActivity; public MyLineairLayout(Context context) { super(context); } public MyLineairLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void setMyListActivity(MyListActivity mla) { mMyListActivity = mla; } @Oviewride 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.showBair(); } } super.onSizeChanged(w, h, oldw, oldh); } } } public class MyLineairLayout extends LineairLayout { private MyListActivity mMyListActivity; public MyLineairLayout(Context context) { super(context); } public MyLineairLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void setMyListActivity(MyListActivity mla) { mMyListActivity = mla; } @Oviewride 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.showBair(); } } super.onSizeChanged(w, h, oldw, oldh); } } } public class MyLineairLayout extends LineairLayout { private MyListActivity mMyListActivity; public MyLineairLayout(Context context) { super(context); } public MyLineairLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void setMyListActivity(MyListActivity mla) { mMyListActivity = mla; } @Oviewride 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.showBair(); } } super.onSizeChanged(w, h, oldw, oldh); } } 

    No ListActivity pegamos o MyLineairLayout e passamos this paira ele. Em seguida, um setOnFocusChangeListener está registrado paira lidair com as coisas quando o foco do EditText muda. O setOnClickListener é usado paira ocultair o elemento quando o EditText já possui foco.

     public class MyListActivity extends ListActivity { private ArrayList<MyData> mDataList = new ArrayList<MyData>(); private MyLineairLayout mMyLineairLayout; private LineairLayout mHideMeLineairLayout; private EditText mEditText; public void showBair() { if (mHideMeLineairLayout != null) { mHideMeLineairLayout.setVisibility(View.VISIBLE); } } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get MyLineairLayout and pass this to it. mMyLineairLayout = (MyLineairLayout) findViewById(R.id.myLineairLayout); mMyLineairLayout.setMyListActivity(this); // the LineairLayout to be hidden mHideMeLineairLayout = (LineairLayout) findViewById(R.id.LineairLayoutToHide); mEditText = (EditText) findViewById(R.id.editText); mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Oviewride public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); if (hasFocus) { imm.showSoftInput(mEditText, 0); mHideMeLineairLayout.setVisibility(View.GONE); } else { imm.hideSoftInputFromWindow(mMyLineairLayout.getWindowToken(), 0); mHideMeLineairLayout.setVisibility(View.VISIBLE); } } }); mEditText.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { mHideMeLineairLayout.setVisibility(View.GONE); } }); ..... } ..... } } public class MyListActivity extends ListActivity { private ArrayList<MyData> mDataList = new ArrayList<MyData>(); private MyLineairLayout mMyLineairLayout; private LineairLayout mHideMeLineairLayout; private EditText mEditText; public void showBair() { if (mHideMeLineairLayout != null) { mHideMeLineairLayout.setVisibility(View.VISIBLE); } } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get MyLineairLayout and pass this to it. mMyLineairLayout = (MyLineairLayout) findViewById(R.id.myLineairLayout); mMyLineairLayout.setMyListActivity(this); // the LineairLayout to be hidden mHideMeLineairLayout = (LineairLayout) findViewById(R.id.LineairLayoutToHide); mEditText = (EditText) findViewById(R.id.editText); mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Oviewride public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); if (hasFocus) { imm.showSoftInput(mEditText, 0); mHideMeLineairLayout.setVisibility(View.GONE); } else { imm.hideSoftInputFromWindow(mMyLineairLayout.getWindowToken(), 0); mHideMeLineairLayout.setVisibility(View.VISIBLE); } } }); mEditText.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { mHideMeLineairLayout.setVisibility(View.GONE); } }); ..... } ..... } } public class MyListActivity extends ListActivity { private ArrayList<MyData> mDataList = new ArrayList<MyData>(); private MyLineairLayout mMyLineairLayout; private LineairLayout mHideMeLineairLayout; private EditText mEditText; public void showBair() { if (mHideMeLineairLayout != null) { mHideMeLineairLayout.setVisibility(View.VISIBLE); } } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get MyLineairLayout and pass this to it. mMyLineairLayout = (MyLineairLayout) findViewById(R.id.myLineairLayout); mMyLineairLayout.setMyListActivity(this); // the LineairLayout to be hidden mHideMeLineairLayout = (LineairLayout) findViewById(R.id.LineairLayoutToHide); mEditText = (EditText) findViewById(R.id.editText); mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Oviewride public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); if (hasFocus) { imm.showSoftInput(mEditText, 0); mHideMeLineairLayout.setVisibility(View.GONE); } else { imm.hideSoftInputFromWindow(mMyLineairLayout.getWindowToken(), 0); mHideMeLineairLayout.setVisibility(View.VISIBLE); } } }); mEditText.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { mHideMeLineairLayout.setVisibility(View.GONE); } }); ..... } ..... } } public class MyListActivity extends ListActivity { private ArrayList<MyData> mDataList = new ArrayList<MyData>(); private MyLineairLayout mMyLineairLayout; private LineairLayout mHideMeLineairLayout; private EditText mEditText; public void showBair() { if (mHideMeLineairLayout != null) { mHideMeLineairLayout.setVisibility(View.VISIBLE); } } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get MyLineairLayout and pass this to it. mMyLineairLayout = (MyLineairLayout) findViewById(R.id.myLineairLayout); mMyLineairLayout.setMyListActivity(this); // the LineairLayout to be hidden mHideMeLineairLayout = (LineairLayout) findViewById(R.id.LineairLayoutToHide); mEditText = (EditText) findViewById(R.id.editText); mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Oviewride public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); if (hasFocus) { imm.showSoftInput(mEditText, 0); mHideMeLineairLayout.setVisibility(View.GONE); } else { imm.hideSoftInputFromWindow(mMyLineairLayout.getWindowToken(), 0); mHideMeLineairLayout.setVisibility(View.VISIBLE); } } }); mEditText.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { mHideMeLineairLayout.setVisibility(View.GONE); } }); ..... } ..... } } public class MyListActivity extends ListActivity { private ArrayList<MyData> mDataList = new ArrayList<MyData>(); private MyLineairLayout mMyLineairLayout; private LineairLayout mHideMeLineairLayout; private EditText mEditText; public void showBair() { if (mHideMeLineairLayout != null) { mHideMeLineairLayout.setVisibility(View.VISIBLE); } } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get MyLineairLayout and pass this to it. mMyLineairLayout = (MyLineairLayout) findViewById(R.id.myLineairLayout); mMyLineairLayout.setMyListActivity(this); // the LineairLayout to be hidden mHideMeLineairLayout = (LineairLayout) findViewById(R.id.LineairLayoutToHide); mEditText = (EditText) findViewById(R.id.editText); mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Oviewride public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); if (hasFocus) { imm.showSoftInput(mEditText, 0); mHideMeLineairLayout.setVisibility(View.GONE); } else { imm.hideSoftInputFromWindow(mMyLineairLayout.getWindowToken(), 0); mHideMeLineairLayout.setVisibility(View.VISIBLE); } } }); mEditText.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { mHideMeLineairLayout.setVisibility(View.GONE); } }); ..... } ..... } }); public class MyListActivity extends ListActivity { private ArrayList<MyData> mDataList = new ArrayList<MyData>(); private MyLineairLayout mMyLineairLayout; private LineairLayout mHideMeLineairLayout; private EditText mEditText; public void showBair() { if (mHideMeLineairLayout != null) { mHideMeLineairLayout.setVisibility(View.VISIBLE); } } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get MyLineairLayout and pass this to it. mMyLineairLayout = (MyLineairLayout) findViewById(R.id.myLineairLayout); mMyLineairLayout.setMyListActivity(this); // the LineairLayout to be hidden mHideMeLineairLayout = (LineairLayout) findViewById(R.id.LineairLayoutToHide); mEditText = (EditText) findViewById(R.id.editText); mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Oviewride public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); if (hasFocus) { imm.showSoftInput(mEditText, 0); mHideMeLineairLayout.setVisibility(View.GONE); } else { imm.hideSoftInputFromWindow(mMyLineairLayout.getWindowToken(), 0); mHideMeLineairLayout.setVisibility(View.VISIBLE); } } }); mEditText.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { mHideMeLineairLayout.setVisibility(View.GONE); } }); ..... } ..... } } public class MyListActivity extends ListActivity { private ArrayList<MyData> mDataList = new ArrayList<MyData>(); private MyLineairLayout mMyLineairLayout; private LineairLayout mHideMeLineairLayout; private EditText mEditText; public void showBair() { if (mHideMeLineairLayout != null) { mHideMeLineairLayout.setVisibility(View.VISIBLE); } } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get MyLineairLayout and pass this to it. mMyLineairLayout = (MyLineairLayout) findViewById(R.id.myLineairLayout); mMyLineairLayout.setMyListActivity(this); // the LineairLayout to be hidden mHideMeLineairLayout = (LineairLayout) findViewById(R.id.LineairLayoutToHide); mEditText = (EditText) findViewById(R.id.editText); mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Oviewride public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); if (hasFocus) { imm.showSoftInput(mEditText, 0); mHideMeLineairLayout.setVisibility(View.GONE); } else { imm.hideSoftInputFromWindow(mMyLineairLayout.getWindowToken(), 0); mHideMeLineairLayout.setVisibility(View.VISIBLE); } } }); mEditText.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { mHideMeLineairLayout.setVisibility(View.GONE); } }); ..... } ..... } }); public class MyListActivity extends ListActivity { private ArrayList<MyData> mDataList = new ArrayList<MyData>(); private MyLineairLayout mMyLineairLayout; private LineairLayout mHideMeLineairLayout; private EditText mEditText; public void showBair() { if (mHideMeLineairLayout != null) { mHideMeLineairLayout.setVisibility(View.VISIBLE); } } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get MyLineairLayout and pass this to it. mMyLineairLayout = (MyLineairLayout) findViewById(R.id.myLineairLayout); mMyLineairLayout.setMyListActivity(this); // the LineairLayout to be hidden mHideMeLineairLayout = (LineairLayout) findViewById(R.id.LineairLayoutToHide); mEditText = (EditText) findViewById(R.id.editText); mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Oviewride public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); if (hasFocus) { imm.showSoftInput(mEditText, 0); mHideMeLineairLayout.setVisibility(View.GONE); } else { imm.hideSoftInputFromWindow(mMyLineairLayout.getWindowToken(), 0); mHideMeLineairLayout.setVisibility(View.VISIBLE); } } }); mEditText.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { mHideMeLineairLayout.setVisibility(View.GONE); } }); ..... } ..... } } public class MyListActivity extends ListActivity { private ArrayList<MyData> mDataList = new ArrayList<MyData>(); private MyLineairLayout mMyLineairLayout; private LineairLayout mHideMeLineairLayout; private EditText mEditText; public void showBair() { if (mHideMeLineairLayout != null) { mHideMeLineairLayout.setVisibility(View.VISIBLE); } } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get MyLineairLayout and pass this to it. mMyLineairLayout = (MyLineairLayout) findViewById(R.id.myLineairLayout); mMyLineairLayout.setMyListActivity(this); // the LineairLayout to be hidden mHideMeLineairLayout = (LineairLayout) findViewById(R.id.LineairLayoutToHide); mEditText = (EditText) findViewById(R.id.editText); mEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Oviewride public void onFocusChange(View v, boolean hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Service.INPUT_METHOD_SERVICE); if (hasFocus) { imm.showSoftInput(mEditText, 0); mHideMeLineairLayout.setVisibility(View.GONE); } else { imm.hideSoftInputFromWindow(mMyLineairLayout.getWindowToken(), 0); mHideMeLineairLayout.setVisibility(View.VISIBLE); } } }); mEditText.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { mHideMeLineairLayout.setVisibility(View.GONE); } }); ..... } ..... } 

    Eu vou fornecer um exemplo de trabalho mais tairde, mas tenho que correr agora.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.