Урок 18. Меняем layoutParams в рабочем приложении

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение damager82 » 02 апр 2014, 21:59

tuuurrik писал(а):Чисто для себя хотел в конце урока сделать возврат ползунка на середину при нажатии на какую-нибудь кнопку. И возник тупой вопрос=) : хотел сделать обработчиком нажатия activity, но у нас там уже стоит
"public class MainActivity extends ActionBarActivity implements OnSeekBarChangeListener"
Мне добавить в конце этого implements OnClickListener? Или сделать другой обработчик?
Спасибо!
Через запятую добавляйте
implements OnSeekBarChangeListener, OnClickListener
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

denny7794
Сообщения: 1
Зарегистрирован: 08 апр 2014, 10:42

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение denny7794 » 08 апр 2014, 10:48

Андрей Д писал(а): Или другими словами - почему после получения lParams1 = (LinearLayout.LayoutParams) btn1.getLayoutParams();
мы, работая с lParams1, непосредственно влияем на btn1?
Присоединяюсь к заданному вопросу.

Аватара пользователя
Leeroy
Сообщения: 67
Зарегистрирован: 12 дек 2013, 21:25

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение Leeroy » 20 апр 2014, 19:20

denny7794 писал(а):
Андрей Д писал(а): Или другими словами - почему после получения lParams1 = (LinearLayout.LayoutParams) btn1.getLayoutParams();
мы, работая с lParams1, непосредственно влияем на btn1?
Присоединяюсь к заданному вопросу.
btn1 это ссылка на параметры кнопки
можно было усложнить

Код: Выделить всё

((LinearLayout.LayoutParams) button2.getLayoutParams()).weight = leftValue;
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма

AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение AlexVinn » 25 апр 2014, 19:32

Подскажите, почему OnSeekBarChangeListener не работает в PlaceholderFragment ?
Вроде как всё правильно сделал.


MainActivity.java
[syntax=java]package com.example.p0181_dynamiclayout3;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.os.Build;

public class MainActivity extends ActionBarActivity {
private static final String TAG = "myLogs";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG,"MainActivity onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}



/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment
implements OnSeekBarChangeListener{

private static final String TAG = "myLogs";
SeekBar sbWeigth;
Button btn1, btn2;
LinearLayout.LayoutParams lParams1;
LinearLayout.LayoutParams lParams2;



public PlaceholderFragment() {
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
Log.d(TAG,"PlaceholderFragment onCreateView");

return rootView;
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
int leftValue = progress;
int rightValue = seekBar.getMax() - progress;
lParams1.weight = leftValue;
lParams2.weight = rightValue;
btn1.setText(String.valueOf(leftValue));
btn2.setText(String.valueOf(rightValue));

Log.d(TAG, "Exec change");
}

@Override
public void onStartTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
Log.d(TAG, "onStartTrackingTouch");
}

@Override
public void onStopTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
Log.d(TAG, "onStopTrackingTouch");
}
}

}
[/syntax]

fragment_main.xml
[syntax=xml]<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<SeekBar
android:id="@+id/sbWeight"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:max="100"
android:progress="50" >
</SeekBar>

<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:orientation="horizontal" >

<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button1" >
</Button>

<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button2" >
</Button>
</LinearLayout>

</LinearLayout>
[/syntax]
Тут должна быть подпись.

Аватара пользователя
Leeroy
Сообщения: 67
Зарегистрирован: 12 дек 2013, 21:25

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение Leeroy » 25 апр 2014, 20:33

AlexVinn писал(а):Подскажите, почему OnSeekBarChangeListener не работает в PlaceholderFragment ?
Вроде как всё правильно сделал.

MainActivity.java
[syntax=java]package com.e.......
[/syntax]

fragment_main.xml
[syntax=xml]<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:lay............
[/syntax]
Без лога ошибок трудновато помогать
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма

AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение AlexVinn » 25 апр 2014, 20:40

Забыл обработчик присвоить. Всем спасибо.
Тут должна быть подпись.

Necroshock
Сообщения: 3
Зарегистрирован: 02 май 2014, 00:01

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение Necroshock » 02 май 2014, 00:05

Подскажите пожалуйста, каким образом эти 2 строки кода

btn1.setText(String.valueOf(leftValue));
btn2.setText(String.valueOf(rightValue));

влияют на работу всего приложения. Без них у меня, при перемещении ползунка, ничего не происходит.
Я так понял, что они отвечают только за написание значений веса в кнопках?

AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение AlexVinn » 02 май 2014, 00:14

Да, только рисуют цифры.
Тут должна быть подпись.

Necroshock
Сообщения: 3
Зарегистрирован: 02 май 2014, 00:01

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение Necroshock » 02 май 2014, 00:35

AlexVinn писал(а):Да, только рисуют цифры.
Я выложу свой код, может вы сможете помочь мне разобраться:
Это main.xml:

Код: Выделить всё

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <SeekBar
        android:id="@+id/seekBar1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="50" />

    <LinearLayout
        android:id="@+id/LinearLayout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Button1" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Button2" />

    </LinearLayout>

</LinearLayout>
а это MainActivity.java:

Код: Выделить всё

package ru.android.p0181_dynamiclayout3;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class MainActivity extends Activity implements OnSeekBarChangeListener {
	
	SeekBar skB; Button btn1; Button btn2; 
	LinearLayout.LayoutParams forlbut;
	LinearLayout.LayoutParams forrbut;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	
	
	skB = (SeekBar) findViewById(R.id.seekBar1);
	btn1 = (Button) findViewById(R.id.button1);
	btn2 = (Button) findViewById(R.id.button2);
	forlbut = (LinearLayout.LayoutParams) btn1.getLayoutParams();
	forrbut = (LinearLayout.LayoutParams) btn2.getLayoutParams();
	skB.setOnSeekBarChangeListener(this);

	
	}


	@Override
	public void onProgressChanged(SeekBar seekBar, int progress,
			boolean fromUser) {
		// TODO Auto-generated method stub
		
	int sleva = progress;
	int sprava = seekBar.getMax() - progress;
	forlbut.weight = sleva;
	forrbut.weight = sprava;
		
	}

	  @Override
	  public void onStartTrackingTouch(SeekBar seekBar) {
	  }

	  @Override
	  public void onStopTrackingTouch(SeekBar seekBar) {
	  }
		
	
}
Если я добавлю 2 строки:

btn1.setText(String.valueOf(sleva));
btn2.setText(String.valueOf(sprava));

то все работает, как и должно.
Но при их отсутствии ползунок перемещается, а ширина кнопок не меняется.
Подскажите пожалуйста в чём ошибка?

AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение AlexVinn » 02 май 2014, 00:49

forlbut.weight = sleva;
forrbut.weight = sprava; тут ширина меняется.


btn1.setText(String.valueOf(sleva));
btn2.setText(String.valueOf(sprava)); тут текст.


. По уроку делай, там всё работает.
Тут должна быть подпись.

Necroshock
Сообщения: 3
Зарегистрирован: 02 май 2014, 00:01

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение Necroshock » 02 май 2014, 10:01

Даже, если делать по уроку, убрав 2 строки:
btn1.setText(String.valueOf(leftValue));
btn2.setText(String.valueOf(rightValue));
приложение перестаёт нормально функционировать!

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение Donart » 02 май 2014, 10:46

Necroshock писал(а):Даже, если делать по уроку, убрав 2 строки:
btn1.setText(String.valueOf(leftValue));
btn2.setText(String.valueOf(rightValue));
приложение перестаёт нормально функционировать!
Ответ дан в уроке и уже обсуждался в этой теме.

sega
Сообщения: 1
Зарегистрирован: 22 май 2014, 19:46

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение sega » 22 май 2014, 19:52

Спасибо за замечательные уроки.

Помогите разобраться с проблемой. Я считаю, что метод onStartTrackingTouch периодически вызывается, пока я пальцем тащу ползунок. Так почему в реальном времени на экране кнопки не изменяются? Изменяются они только после повторного касания по ползунку. И то показывают не текущее значение progress, а старое (предыдущее). Делал все по уроку.

betirsolt
Сообщения: 38
Зарегистрирован: 03 июл 2014, 23:45

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение betirsolt » 20 июл 2014, 01:29

Не понятна конструкция

Код: Выделить всё

lParams1 = (LinearLayout.LayoutParams) btn1.getLayoutParams();
	lParams2 = (LinearLayout.LayoutParams) btn2.getLayoutParams();
почему при этом lParams1 и lParams2 влияют на свойства btn1 и btn2? тут вроде переменным lParams как бы присваиваются значения btn, а получается что наоборот, пожалуйста кто нибудь объясните эту конструкцию по подробнее, а то у меня непонятки

betirsolt
Сообщения: 38
Зарегистрирован: 03 июл 2014, 23:45

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение betirsolt » 20 июл 2014, 01:51

Necroshock писал(а):Даже, если делать по уроку, убрав 2 строки:
btn1.setText(String.valueOf(leftValue));
btn2.setText(String.valueOf(rightValue));
приложение перестаёт нормально функционировать!
присоединяюсь, у меня тоже не работает есть убрать эти две строки, казалось бы причем тут они? и где это обсуждалось? я эту тему всю просмотрел, тут нет ответа на этот вопрос

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение Donart » 20 июл 2014, 08:09

присоединяюсь, у меня тоже не работает есть убрать эти две строки, казалось бы причем тут они? и где это обсуждалось? я эту тему всю просмотрел, тут нет ответа на этот вопрос
Первые сообщения в этой теме отвечают на Ваш вопрос.
Вот цитата из урока.
Есть небольшой нюанс. Как верно заметили в каментах, если просто написать код lParams1.weight = 1, то компонент не изменится. Необходимо дописать код: btn1.requestLayout(). Тогда кнопка прочтет Layout и перерисуется. Этот метод уже вызывается в setText, поэтому мы его здесь явно не вызываем.

betirsolt
Сообщения: 38
Зарегистрирован: 03 июл 2014, 23:45

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение betirsolt » 20 июл 2014, 18:34

спасибо, значит все работает но просто не перерисовывается? а про lParams и btn все равно не понятно

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение Donart » 20 июл 2014, 18:51

спасибо, значит все работает но просто не перерисовывается?
Что работает? Метод setText в данном случае выполняет две задачи, пишет текст на кнопке и меняет размер кнопки вызывая метод requestLayout(). Попробуйте удалить btn1.setText(String.valueOf(leftValue)) и вместо напистать btn1.requestLayout().

betirsolt
Сообщения: 38
Зарегистрирован: 03 июл 2014, 23:45

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение betirsolt » 20 июл 2014, 20:38

Donart писал(а):
спасибо, значит все работает но просто не перерисовывается?
Что работает? Метод setText в данном случае выполняет две задачи, пишет текст на кнопке и меняет размер кнопки вызывая метод requestLayout(). Попробуйте удалить btn1.setText(String.valueOf(leftValue)) и вместо напистать btn1.requestLayout().
я имел ввиду что все работает и без btn1.setText(String.valueOf(leftValue)), текст и размер меняется, но мы этого не видим потому что не перерисовывается экран

kvg_ua
Сообщения: 5
Зарегистрирован: 10 июн 2014, 21:05

Re: Урок 18. Меняем layoutParams в рабочем приложении

Сообщение kvg_ua » 20 авг 2014, 14:35

Добрый день!
У меня возникла одна проблема. Мне нужно, чтобы высота кнопки была в 1,5 раза меньше чем ширина. Параметр android:layout_width="match_parent". В методе onCreate я пишу следующий код:

Код: Выделить всё

	    lParams = (LinearLayout.LayoutParams) btn1.getLayoutParams();
	    int w = lParams.width;
	    int h = Math.round(w/1.5f);
	    lParams.height = h;
При запуске программы, кнопка занимает весь экран. Если вывести заначения переменных w и h, то выводятся -1, -1.
Я понимаю, что причина в "match_parent", потому что, если я ставлю ширину кнопки 200dp, то все работает и значения переменных w=200, h=133.
Подскажите, пожалуйста, как можно выйти из этого затруднения?

Ответить