преобразование класса в интерфейс

#java #android

#java #Android

Вопрос:

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

 package com.droidnova.android.howto.optionmenu;



import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

public class ControlMenu extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.settings:     
                Intent intent = new Intent(this, ShowSettings.class);
                  startActivity(intent);
            break;
            case R.id.services:     
                Intent intent2 = new Intent(this, Test.class);
                startActivity(intent2);
              break;
            case R.id.Quit: 

                finish();



                break;
            default:    
            break;
        }
        return true;
    }
}
  

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

 public class Test extends ListActivity  {


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listplaceholder);

        ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

        JSONObject json = JSONfunctions.getJSONfromURL("http://midsweden.gofreeserve.com/fetch.php");

        try{

            JSONArray  earthquakes = json.getJSONArray("earthquakes");

            for(int i=0;i<earthquakes.length();i  ){                        
                HashMap<String, String> map = new HashMap<String, String>();    
                JSONObject e = earthquakes.getJSONObject(i);

                map.put("id",  String.valueOf(i));
                map.put("name", "Earthquake name:"   e.getString("name"));
                map.put("password", "Magnitude: "    e.getString("password"));
                mylist.add(map);            
            }       
        }catch(JSONException e)        {
             Log.e("log_tag", "Error parsing data " e.toString());
        }

        ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.test, 
                        new String[] { "name", "magnitude" }, 
                        new int[] { R.id.item_title, R.id.item_subtitle });

        setListAdapter(adapter);

        final ListView lv = getListView();
        lv.setTextFilterEnabled(true);  
        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {              
                @SuppressWarnings("unchecked")
                HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);                   
                Toast.makeText(Test.this, "ID '"   o.get("id")   "' was clicked.", Toast.LENGTH_SHORT).show(); 

            }
        });
    }
}
  

теперь я следую этим путем

 package com.droidnova.android.howto.optionmenu;

import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.content.Intent;

public class MenuHandler extends Activity{
    private Activity activity;

    public MenuHandler(Activity activity) {
        this.activity = activity;
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = activity.getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

     public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.settings:     
            Intent intent = new Intent(this, ShowSettings.class);
              startActivity(intent);
        break;
        case R.id.services:     
            Intent intent2 = new Intent(this, Test.class);
            startActivity(intent2);
          break;
        case R.id.Quit: 

            finish();



            break;
        default:    
        break;
    }
    return true;
}
  

}
и тестовый класс — это

 package com.droidnova.android.howto.optionmenu;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class Test extends ListActivity  {
    private MenuHandler menuHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listplaceholder);
        menuHandler = new MenuHandler(this);
        ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

        JSONObject json = JSONfunctions.getJSONfromURL("http://midsweden.gofreeserve.com/fetch.php");

        try{

            JSONArray  earthquakes = json.getJSONArray("earthquakes");

            for(int i=0;i<earthquakes.length();i  ){                        
                HashMap<String, String> map = new HashMap<String, String>();    
                JSONObject e = earthquakes.getJSONObject(i);

                map.put("id",  String.valueOf(i));
                map.put("name", "Earthquake name:"   e.getString("name"));
                map.put("password", "Magnitude: "    e.getString("password"));
                mylist.add(map);            
            }       
        }catch(JSONException e)        {
             Log.e("log_tag", "Error parsing data " e.toString());
        }

        ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.test, 
                        new String[] { "name", "magnitude" }, 
                        new int[] { R.id.item_title, R.id.item_subtitle });

        setListAdapter(adapter);

        final ListView lv = getListView();
        lv.setTextFilterEnabled(true);  
        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {              
                @SuppressWarnings("unchecked")
                HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);                   
                Toast.makeText(Test.this, "ID '"   o.get("id")   "' was clicked.", Toast.LENGTH_SHORT).show(); 

            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return menuHandler.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return menuHandler.onOptionsItemSelected(item);
    }
}
  

меню отлично отображается на экране, но когда я нажимаю на любое меню, появляется надпись «Принудительно остановить»

Теперь я могу получать ошибки логирования, вот они введите описание изображения здесь

Комментарии:

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

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

Ответ №1:

Что бы я сделал, так это создал специальный класс для обработки создания меню и событий и делегировал ему все. Код будет выглядеть следующим образом:

 public class MenuHandler {
    private Activity activity;

    public MenuHandler(Activity activity) {
        this.activity = activity;
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = activity.getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        //Handle events here
    }
}
  

Затем, когда вам нужно иметь меню в вашем Activity , вы создаете MenuHandler и делегируете ему вызовы методов:

 public MyActivity extends Activity {
    private MenuHandler menuHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        menuHandler = new MenuHandler(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return menuHandler.onCreateOprionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return menuHandler.onOptionsItemSelected(item);
    }
}
  

Комментарии:

1. Конечно, нет абсолютно никакой разницы.

2. извините за этот вопрос, в тестовом классе мне нужно вызвать код, который вы указали в Myactivity, даже если он расширяется из list activity

3. Точно. В вашем случае тестовым классом будет MyActivity в моем коде.

4. Большое спасибо, Малкольм . Я попытаюсь реализовать это, и если возникнет какая-то проблема, я немного побеспокою вас 🙂

5. Привет, Малкольм. пожалуйста, помогите мне еще немного. я обновил программу, как вы сказали, но я столкнулся с проблемой, что меню отображается идеально, но когда я нажимаю на любой из всплывающих окон it force to stop

Ответ №2:

Интерфейс не имеет реализации, поэтому я не думаю, что это будет делать то, что вы хотите.

Что вы можете сделать, так это создать действие, которое расширяет ваш ControlMenu . Это будет Activity (потому что controlmenu сам расширяет activity), и он сможет использовать код, который вы предоставили здесь. Это будет выглядеть примерно так

 public class yourActivity extends ControlMenu{
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); //oncreate of controlmenu
        LayoutInflater inflater = getLayoutInflater();
        RelativeLayout ll = (RelativeLayout) findViewById(R.id.main);
        ListView lv = (ListView) inflater.inflate(R.layout.yourlistview, ll, false);
        ll.addView(lv);
        lv.setAdapter(new YourAdapter(this)); 
    }
}
  

и у вас будет адаптер, который выглядит как (быстрый макет)

 public abstract class YourAdapter extends BaseAdapter {

   final public int getCount() {}
   final public Object getItem(int position) {}
   final public long getItemId(int position) {}
   final public void onItemClick() {}       
  

}

Комментарии:

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

2. Вы могли бы создать адаптер и использовать его для заполнения списка из Activity?

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

4. Теперь я получаю logcat, пожалуйста, ознакомьтесь с обновленным вопросом