Android: создать новое намерение с помощью кнопки из GridView (GridView с навигационными кнопками) - PullRequest
1 голос
/ 26 января 2012

Я создал класс типа BaseAdapter, который заполняется кнопками - когда вы нажимаете на кнопку, я хочу загрузить новое намерение.Это оказалось трудным на двух уровнях:

  1. Вы не можете связать событие с кнопкой (той, которая создает новое намерение) внутри Адаптера.Вот почему я отправляю кнопки в виде массива на мой адаптер (это решение работает, но оно грязное)

  2. Даже если мои кнопки созданы внутри одной и той же операции - они не могут создатьновое намерение от этой деятельности.Исключение настолько велико, что я даже не получил оператор try ... catch для работы.

Я пробовал отражение, создавая кнопки внутри действия и пропуская их, передаваяконтекст (для вызова context.startIntent (...))

Мой вопрос: может ли кто-нибудь показать мне, как создать ButtonAdapter, где каждая кнопка создает новое намерение - даже того же типа, что и исходное действие?

ОБНОВЛЕНИЕ : Вот код, потому что я получаю ответы от людей, которые думают, что я борюсь с onClickListeners:

public class ButtonAdapter extends BaseAdapter
{
    private Context _context;
    private Button[] _button;

    public ButtonAdapter(Context c, Button[] buttons)
    {
        _context = c;  
        _button = buttons;
    }

    // Total number of things contained within the adapter  
    public int getCount()
    {  
        return _button.length;  
    }  

    // Require for structure, not really used in my code.  
    public Object getItem(int position)
    {  
        return _button[position];  
    }  

    // Require for structure, not really used in my code. Can  
    // be used to get the id of an item in the adapter for  
    // manual control.  
    public long getItemId(int position)
    {  
        return position;  
    }  

    public View getView(int position, View convertView, ViewGroup parent) 
    {          
        _button[position].setId(position);  
        return _button[position];  
    }
}

---------------Активность:

public class MainActivity extends Activity
{
    private GridView _gv;
    private TextView _heading;       
    private ButtonAdapter _adapter;

    public void LoadActivity(String heading)
    {
        try
        {
            Itent intent = new Intent(getApplicationContext(), MainActivity.class);
            intent.putExtra("Level", "NextPage");
            intent.putExtra("Heading", heading);
            startActivity(intent);
        }
        catch (Exception ex)
        {
            Toast.makeText(getApplicationContext(), String.format("Error LoadActivity: %s", ex.getMessage()), Toast.LENGTH_SHORT).show();
        }
    }    

    private void createButtonsAdapter(Button _button[])
    {
        _buttonadapter = new ButtonAdapter(getApplicationContext(), _button);
        _gv.setAdapter(_adapter);  
    }         

    private void setupButtons()
    {
        Button[] _buttons = new Button[2];
        String names[] = new String[]{"Button1","Button2"};

        for (int i = 0; i < 2; i++)
        {
            _buttons[i] = new Button(this);
            _buttons[i].setText(names[i]);
            _buttons[i].setTag(names[i]);

           _buttons[i].setOnClickListener(new View.OnClickListener()
           {
               public void onClick(View arg0)
               {
                   try
                   {
                       LoadActivity(((Button)arg0).getTag().toString());
                   }
                   catch(Exception ex)
                   {
                       Toast.makeText(getApplicationContext(), String.format("Error button.onClick: %s", ex.getMessage()), Toast.LENGTH_SHORT).show();
                   }
               }
           });
        }
        createButtonsAdapter(_buttons);     
    }

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

        _gv = (GridView)findViewById(R.id.gridview);
        _heading = (TextView)findViewById(R.id.tv_heading);                      

        Bundle params = getIntent().getExtras();                

        if (params == null)
        {
            setupButtons();    
        }  
        else if (params.containsKey("Level"))
        {
            _heading.setText(params.getString("Heading"));
            if (params.getString("Level").equals("NextPage"))
            {
                //code not here yet
            }
            else if (params.getString("Level").equals("Chapters"))
            {
                //future code
            }
        }
    }
}

Извините за жирный шрифт и заглавные буквы, но у меня было достаточно глупых ответов, чтобы оправдать это: Я ПОПЫТАЛСЯ ПОСТАВИТЬ ONCLICKLISTENER ВНУТРИ СЕТЕВОГО ВИДА, И ЭТО НЕ РАБОТАЕТ Вы не можете загрузить действие из класса вне этого действия, даже если вы передали контекст в качестве параметра.Вот почему я прибег к этому методу, который полностью взрывает Android, хотя я пытаюсь использовать операторы catch.

Пожалуйста, попробуйте дать мне решение в форме исправления моего кода, другого кода илиучебник, который достигает того, что я хочу здесь.Я знаю, как правильно сделать адаптер кнопок, именно загрузка Intent заставила меня реализовать его таким образом.

Ответы [ 3 ]

0 голосов
/ 26 января 2012

Полагаю, вы можете легко манипулировать кнопками, созданными в базовом адаптере расширения вашего класса.В методе getView .... если у вас есть кнопка b .., сделайте это следующим образом

b.setOnClickListener(new OnClickListener()
{
    public void onClick()
    {
        // Do your stuff here ... 
    }
});

, и если вы хотите начать другое действие по нажатию этой кнопки, вам нужно передать контекст вызовак этому адаптеру.

0 голосов
/ 28 января 2012

Еще раз я отвечаю на свой вопрос: http://bottlecapnet.blogspot.com/2012/01/android-buttons-have-no-place-inside.html

Мне просто нужно оформить TextViews так, как я хочу их видеть.

0 голосов
/ 26 января 2012

Я предлагаю следующее,

  1. Использование общего списка onClick для всех кнопок в сетке
  2. Установить тег для всех кнопок в функции getView. адаптера.
  3. Используйте тэг Object, чтобы определить намерение запустить от слушателя onClick.

Надеюсь, это поможет ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...