floating context menu funktioniert nicht

T

T3tris

Neues Mitglied
0
Hallo,
ich bin relativ neu bei der Android App Entwicklung und habe bei meiner Appentwicklung ein kleines Problem mit dem floating context menu.
Ich habe bei meiner App ursprünglich mit einem LinearLayout gearbeitet, welches ich dynamisch per Code gefüllt/geleert habe.
Dies war aber recht hässlich Programmiert und beim Aufruf des Floating Context Menu wurde mir nie die selektierte View mitgegeben, was mir somit nichts gebracht hat.

Ein bekannter wies mich darauf hin, dass es sich lohnt mit ListViews zu arbeiten und dass dies bei ListViews funktioniert.

Daraufhin änderte ich meinen Code auf eine ListView (viel schöner und anhand eigener "Zeilenlayouts" natürlich viel schöner).
Nun funktioniert alles bis auf das Aufrufen des Context Menus. bzw. die Methode onCreateContextMenu(...){...} wird nicht ausgeführt und ich weiß nicht warum.:confused2::sad:

Mit dem ganz Normalen Optionsmenü funktioniert dies jedoch aber ich möchte das gerne mit dem floating context menu verwirklichen.

Beim Ausführen der App passiert also beim long click auf eine Zeile des Layouts nichts.
Mit eigenen OnLongClickListenern habe ich es auch schon versucht, aber das funktioniert auch nicht.:sad:

ich hoffe mir kann bei meinem Problem irgendjemand behilflich sein:confused2:

Hier nun mein Code:

//--------------Die Haupt Activity-------------------------
Code:
public class SpielerlistActivity extends Activity {

    private MyDataSource database;
    ArrayList<SpielermitBewertung> spieler=new ArrayList<SpielermitBewertung>();
    private SpielerlistArrayAdapter adapter;
    private AlertDialog dialogspieleranlegen;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_spieler_list);
        this.setDatabase(new MyDataSource(this));
        this.getDatabase().open();
        ListView lv=(ListView)findViewById(R.id.spielerlistListView);
        this.spieler=this.database.getAllSpielermitBewertung();
        adapter=new SpielerlistArrayAdapter(spieler,this);
        lv.setAdapter(adapter);
        lv.setClickable(true);
        lv.setLongClickable(true);
        registerForContextMenu(lv);
    }

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

    
    //diese Funktion funktioniert ist aber kein Context menu
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.add_player) {
            //... dies funktioniert
        } else if (id == R.id.delete_player){
            spieler.remove((spieler.size()-1));
            adapter.notifyDataSetChanged();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
   
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.spieler_list_contextmenue, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }
   
    @Override
    public boolean onContextItemSelected(MenuItem item) {   
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        int positionImArray=info.position;
        switch (item.getItemId()) {  
            case R.id.SpielerlistContextmenueSpielerBearbeiten:
               
            case R.id.SpielerlistContextmenueSpielerLoeschen:
                SpielermitBewertung sp = this.spieler.get(positionImArray);
                this.database.deleteSpielermitBewertung(sp.getId());
                this.spieler.remove(sp);
                this.adapter.notifyDataSetChanged();
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }
   
    private SpielerlistActivity getActivity() {
        return this;
    }
   
    private MyDataSource getDatabase() {
        return this.database;
    }

    private void setDatabase(MyDataSource myDataSource){
        this.database=myDataSource;
    }
   
}
//------------------Der ArrayAdapter für die ListView-------------------------------
Code:
public class SpielerlistArrayAdapter extends ArrayAdapter<SpielermitBewertung>{

    private List<SpielermitBewertung> playerlist;
    private Context context;
    
    public SpielerlistArrayAdapter(List<SpielermitBewertung> playerList, Context ctx) {
        super(ctx, R.layout.spieleruebersichtschema,playerList);
        this.playerlist = playerList;
        this.context = ctx;
    }
    
    public View getView (int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.spieleruebersichtschema, parent, false);
        }
        TextView vornametextview = (TextView) convertView.findViewById(R.id.spieleruebersichtschemavornametextView);
        TextView nachnametextview = (TextView) convertView.findViewById(R.id.spieleruebersichtschemanachnametextview);
        TextView bewertungstextview = (TextView) convertView.findViewById(R.id.spieleruebersichtschemabewertungstextview);
        SpielermitBewertung p = playerlist.get(position);
        vornametextview.setText(p.getVorname());
        nachnametextview.setText(p.getNachname());
        bewertungstextview.setText(p.getBewertung()+"");
        convertView.setClickable(true);
        convertView.setLongClickable(true);
        return convertView;
    }
}

//--------------Das Object SpielermitBewertung------------------------
Code:
public class SpielermitBewertung {
    private long id;
    private String vorname;
    private String nachname;
    private int bewertung;
    
    public SpielermitBewertung(long id, String vorname, String nachname, int bewertung){
        this.setId(id);
        this.setVorname(vorname);
        this.setNachname(nachname);
        this.setBewertung(bewertung);
    }

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String name) {
        this.vorname = name;
    }
    
    public String getNachname() {
        return nachname;
    }

    public void setNachname(String name) {
        this.nachname = name;
    }

    public int getBewertung() {
        return bewertung;
    }

    public void setBewertung(int bewertung) {
        this.bewertung = bewertung;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
    
    @Override
    public String toString() {
        return "Spieler [Id=" + id + ", Vorname=" + vorname + ", Nachname=" + nachname + ", Bewertung=" + bewertung
                + "]";
    }
}
//--------------Das XML Layout mit der ListView -------------------------------------------
Code:
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/GridLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnCount="2"
    android:orientation="horizontal"
    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="de.spielerlist.nr1.SpielerlistActivity" >

    <ListView
        android:id="@+id/spielerlistListView"
        android:layout_gravity="fill_horizontal" >
    </ListView>

    <Space
        android:layout_column="1"
        android:layout_gravity="fill_vertical"
        android:layout_row="1" />

</GridLayout>
//-----------Das XML Layout für die einzelnen Zeilen der ListView------------------------------
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="right"
    android:orientation="horizontal" >

    <CheckBox
        android:id="@+id/spieleruebersichtschemacheckbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:textSize="15dp" />

    <HorizontalScrollView
        android:id="@+id/spieleruebersichtschemanamescrollview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginRight="10dp"
        android:layout_weight="1" >

        <LinearLayout
            android:id="@+id/spieleruebersichtschemascrollviewlinearlayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/spieleruebersichtschemavornametextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_weight="0"
                android:text="vorname"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textSize="15dp" />

            <TextView
                android:id="@+id/spieleruebersichtschemanachnametextview"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginLeft="10dp"
                android:layout_weight="0"
                android:text="nachname"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textSize="15dp" />

        </LinearLayout>
    </HorizontalScrollView>

    <TextView
        android:id="@+id/spieleruebersichtschemabewertungbeschreibungtextview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginRight="5dp"
        android:layout_weight="0"
        android:text="@string/bewertungdoppelpunkt"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textSize="15dp" />

    <TextView
        android:id="@+id/spieleruebersichtschemabewertungstextview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="0"
        android:text="0"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textSize="15dp" />

</LinearLayout>
//---------------------------Das Context Menu--------------------------------------
Code:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
     <item android:id="@+id/SpielerlistContextmenueSpielerBearbeiten"  android:title="@string/Spielerlist_Spielerbearbeiten_Menue"></item>
     <item android:id="@+id/SpielerlistContextmenueSpielerLoeschen"  android:title="@string/Spielerlist_Spielerloeschen_Menue"></item>
    

</menu>
 
Zuletzt bearbeitet von einem Moderator:
Okay mein fehler war, dass die Horizontal ScrollView das onlongklick event "geschluckt" hat, d.h. ich musste eine umgehung im Adapter schaffen, der das longclickevent für die parent view der ScrollView auslöst
Code:
public View getView (int position, View convertViewx, ViewGroup parent) {
        if (convertViewx == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertViewx = inflater.inflate(R.layout.spieleruebersichtschema, parent, false);
        }
        final View convertView = convertViewx;
        TextView vornametextview = (TextView) convertView.findViewById(R.id.spieleruebersichtschemavornametextView);
        TextView nachnametextview = (TextView) convertView.findViewById(R.id.spieleruebersichtschemanachnametextview);
        TextView bewertungstextview = (TextView) convertView.findViewById(R.id.spieleruebersichtschemabewertungstextview);
        HorizontalScrollView sc= (HorizontalScrollView) convertView.findViewById(R.id.spieleruebersichtschemanamescrollview);
        GestureDetector.OnGestureListener listener = new GestureDetector.SimpleOnGestureListener()
        {
            @Override
            public void onLongPress(MotionEvent e)
            {
                convertView.performLongClick();
            }
        };
        final GestureDetector gestureDetector = new GestureDetector(this.context, listener);
        sc.setOnTouchListener(new View.OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                return gestureDetector.onTouchEvent(event);
            }
        });
        
        SpielermitBewertung p = playerlist.get(position);
        vornametextview.setText(p.getVorname());
        nachnametextview.setText(p.getNachname());
        bewertungstextview.setText("  "+p.getBewertung());
        convertView.setClickable(true);
        convertView.setLongClickable(true);
        return convertView;
    }
 

Ähnliche Themen

SaniMatthias
Antworten
19
Aufrufe
940
swa00
swa00
O
Antworten
15
Aufrufe
2.951
ORHUX
O
K
Antworten
3
Aufrufe
1.164
Kapikalaani
K
Zurück
Oben Unten