Страница 1 из 1

Помогите с actionLayout [РЕШЕНО]

Добавлено: 14 июн 2015, 23:08
Сергей Казаков
Скажите, как сделать onClickListener для кнопки, вызванной actionLayout? Пробовал, но приложение выдаёт ошибку:
1. Пробовал в OnClick, и вот, что получилось:
[syntax=java]package com.android.develop;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity
{

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
Button button1 = (Button) findViewById(R.id.button_1);
Button button2 = (Button) findViewById(R.id.button_2);

OnClickListener onclick1 = new OnClickListener()
{
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.button_1:
Toast toast1 = Toast.makeText(getApplicationContext(),"Нажата кнопка" ,Toast.LENGTH_SHORT);
toast1.show();
break;
case R.id.button_2:
Toast toast2 = Toast.makeText(getApplicationContext(),"Нажата кнопка Action Bar" ,Toast.LENGTH_SHORT);
toast2.show();
break;
}
}
};
button1.setOnClickListener(onclick1);
button2.setOnClickListener(onclick1);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
}[/syntax]
Изображение
2. Пробовал занести в OnOptionsItemSelected:
[syntax=java]package com.android.develop;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity
{

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
Button button1 = (Button) findViewById(R.id.button_1);

OnClickListener onclick1 = new OnClickListener()
{
@Override
public void onClick(View v)
{
Toast toast1 = Toast.makeText(getApplicationContext(),"Нажата кнопка" ,Toast.LENGTH_SHORT);
toast1.show();
}
};
button1.setOnClickListener(onclick1);
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.button_2:
Toast toast2 = Toast.makeText(getApplicationContext(),"Нажата кнопка Action Bar" ,Toast.LENGTH_SHORT);
toast2.show();
break;
}
return super.onOptionsItemSelected(item);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
}[/syntax]
Но при нажатии на кнопку ничего не происходит
Изображение
3. Пробовал занести в OnOptionsItemSelected не по id кнопки в actionLayout, а по id пункта меню, но сообщение всплывает не от кнопки, а от пункта меню:
[syntax=java]package com.android.develop;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity
{

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
Button button1 = (Button) findViewById(R.id.button_1);

OnClickListener onclick1 = new OnClickListener()
{
@Override
public void onClick(View v)
{
Toast toast1 = Toast.makeText(getApplicationContext(),"Нажата кнопка" ,Toast.LENGTH_SHORT);
toast1.show();
}
};
button1.setOnClickListener(onclick1);
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.menu_2:
Toast toast2 = Toast.makeText(getApplicationContext(),"Нажата кнопка Action Bar" ,Toast.LENGTH_SHORT);
toast2.show();
break;
}
return super.onOptionsItemSelected(item);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
}[/syntax]
Изображение
Код res/menu/menu_main.xml:
[syntax=xml]<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_1"
android:icon="@android:drawable/ic_menu_help"
android:title="@string/title_2"
android:orderInCategory="1"
android:showAsAction="always" />
<item
android:id="@+id/menu_2"
android:icon="@android:drawable/ic_menu_search"
android:title="@string/title_3"
android:orderInCategory="0"
android:showAsAction="collapseActionView|always"
android:actionLayout="@layout/action_main_layout" />
</menu>[/syntax]
Код res/layout/action_main_layout.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">
<Button
android:id="@+id/button_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>[/syntax]

Re: Помогите с actionLayout

Добавлено: 14 июн 2015, 23:52
Dark67
В файле разметки main_layout должны быть прописаны две кнопочки с идентификаторами R.id.button_1 и R.id.button_2

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 00:06
Сергей Казаков
Dark67 писал(а):В файле разметки main_layout должны быть прописаны две кнопочки с идентификаторами R.id.button_1 и R.id.button_2
Нет, первая кнопка не из actionLayout, а на экране

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 00:07
Сергей Казаков
Dark67 писал(а):В файле разметки main_layout должны быть прописаны две кнопочки с идентификаторами R.id.button_1 и R.id.button_2
И это проблему не решило

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 12:51
Foenix
программируешь вслепую?
а в лог посмотреть?

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 12:58
Dark67
Сергей Казаков писал(а):
Dark67 писал(а):В файле разметки main_layout должны быть прописаны две кнопочки с идентификаторами R.id.button_1 и R.id.button_2
Нет, первая кнопка не из actionLayout, а на экране
Глядя на код, у тебя две кнопки должны быть в main_layout и для них ты устанавливаешь слушателя

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 19:05
Сергей Казаков
Foenix писал(а):программируешь вслепую?
а в лог посмотреть?
Я смотрел, он пустой после этих ошибок

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 19:12
Сергей Казаков
Dark67 писал(а):
Сергей Казаков писал(а):
Dark67 писал(а):В файле разметки main_layout должны быть прописаны две кнопочки с идентификаторами R.id.button_1 и R.id.button_2
Нет, первая кнопка не из actionLayout, а на экране
Глядя на код, у тебя две кнопки должны быть в main_layout и для них ты устанавливаешь слушателя
Я думал вы про main_layout. Вы про action_main_layout?

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 19:14
Сергей Казаков
Dark67 писал(а):
Сергей Казаков писал(а):
Dark67 писал(а):В файле разметки main_layout должны быть прописаны две кнопочки с идентификаторами R.id.button_1 и R.id.button_2
Нет, первая кнопка не из actionLayout, а на экране
Глядя на код, у тебя две кнопки должны быть в main_layout и для них ты устанавливаешь слушателя
Но у меня есть main_layout, и он к вопросу не относится:
[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="start"
android:orientation="vertical">
<SeekBar
android:id="@+id/seekbar_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/distance_1"
android:layout_marginRight="@dimen/distance_1"
android:layout_marginTop="@dimen/distance_1"
android:layout_marginBottom="@dimen/distance_1"
android:max="1000"
android:progress="500" />
<ProgressBar
android:id="@+id/prorgessbar_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/distance_1"
android:layout_marginRight="@dimen/distance_1"
android:layout_marginBottom="@dimen/distance_1"
style="?android:attr/progressBarStyleLarge" />
<TextView
android:id="@+id/text_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/distance_1"
android:layout_marginRight="@dimen/distance_1"
android:layout_marginBottom="@dimen/distance_1"
android:text="@string/title_7"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/distance_1"
android:layout_marginRight="@dimen/distance_1"
android:layout_marginBottom="@dimen/distance_1"
android:text="@string/title_8" />
<ProgressBar
android:id="@+id/progressbar_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/distance_1"
android:layout_marginRight="@dimen/distance_1"
android:layout_marginBottom="@dimen/distance_1"
style="?android:attr/progressBarStyleHorizontal"
android:indeterminate="@bool/boolean_1" />
</LinearLayout>[/syntax]

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 19:38
Dark67
Тогда просто опиши, что нужно и прикрепи файлы с кодом и разметкой, относящиеся к вопросу.

В вышеопубликованных файлах я не нашел actionLayout. Если под этим подразумевается разметка action_main_layout, то не видно активити, которая использует этот файл разметки.
Далее, я заметил, что R.id.button_1 находится в main_layout, а R.id.button_2 находится в action_main_layout. Так почему слушателя ты пытаешься повесить на вторую кнопку в активити, которая использует main_layout, в котором нет кнопки R.id.button_2?

........
Сорри, глянул еще раз. Ща разберемся

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 19:43
doter.ua
Вы указываете кастомный вид для пункта экшен бара. Планируйте их с учетом того, что будете обрабатывать нажатие на пункт, а не на его дочерний элемент.
http://developer.android.com/guide/topi ... ActionView

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 19:48
Dark67
doter.ua уже дал правильное направление.

или так
[syntax=java]@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.menu_2:
Toast toast2 = Toast.makeText(getApplicationContext(),"Нажата кнопка Action Bar" ,Toast.LENGTH_SHORT);
toast2.show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}[/syntax]

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 22:48
Сергей Казаков
Dark67 писал(а):Тогда просто опиши, что нужно и прикрепи файлы с кодом и разметкой, относящиеся к вопросу.

В вышеопубликованных файлах я не нашел actionLayout. Если под этим подразумевается разметка action_main_layout, то не видно активити, которая использует этот файл разметки.
Далее, я заметил, что R.id.button_1 находится в main_layout, а R.id.button_2 находится в action_main_layout. Так почему слушателя ты пытаешься повесить на вторую кнопку в активити, которая использует main_layout, в котором нет кнопки R.id.button_2?

........
Сорри, глянул ещё раз. Ща разберемся
R.id.button_1 - эта кнопка не относится к вопросу, это я практиковался на ней. Она в main_layout
R.id.button_2 - кнопка в actionLayout, которой я пытаюсь сделать онклик.
И ещё, подскажите, как создать активити для разметки action_main_layout? Что тогда написать в item в menu, чтобы передать ему это активити?

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 22:52
Сергей Казаков
doter.ua писал(а):Вы указываете кастомный вид для пункта экшен бара. Планируйте их с учетом того, что будете обрабатывать нажатие на пункт, а не на его дочерний элемент.
http://developer.android.com/guide/topi ... ActionView
Спасибо!

Re: Помогите с actionLayout

Добавлено: 15 июн 2015, 23:42
Dark67
Сергей Казаков писал(а):
Dark67 писал(а): И ещё, подскажите, как создать активити для разметки action_main_layout? Что тогда написать в item в menu, чтобы передать ему это активити?
Попробуй так

[syntax=java]
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.menu_main, menu);

menu.findItem(R.id.menu_2).getActionView().findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast toast2 = Toast.makeText(getApplicationContext(),"Нажата кнопка Action Bar" ,Toast.LENGTH_SHORT);
toast2.show();
}
});

return super.onCreateOptionsMenu(menu);
} [/syntax]

Re: Помогите с actionLayout

Добавлено: 16 июн 2015, 17:37
Сергей Казаков
Dark67 писал(а):
Сергей Казаков писал(а):
Dark67 писал(а): И ещё, подскажите, как создать активити для разметки action_main_layout? Что тогда написать в item в menu, чтобы передать ему это активити?
Попробуй так

[syntax=java]
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.menu_main, menu);

menu.findItem(R.id.menu_2).getActionView().findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast toast2 = Toast.makeText(getApplicationContext(),"Нажата кнопка Action Bar" ,Toast.LENGTH_SHORT);
toast2.show();
}
});

return super.onCreateOptionsMenu(menu);
} [/syntax]
Спасибо

Re: Помогите с actionLayout

Добавлено: 17 июн 2015, 01:40
Сергей Казаков
Dark67 писал(а):doter.ua уже дал правильное направление.

или так
[syntax=java]@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.menu_2:
Toast toast2 = Toast.makeText(getApplicationContext(),"Нажата кнопка Action Bar" ,Toast.LENGTH_SHORT);
toast2.show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}[/syntax]
Ещё раз огромное спасибо, ваш способ заработал!