Custom Layout wird nicht angezeigt

  • 5 Antworten
  • Letztes Antwortdatum
D

Daepilin

Neues Mitglied
1
Hio :)

Ich hab ein Problem: Ich möchte in einer App eine Spielermenge eingeben können und das layout für die eingaben der namen dynamisch anpassen. Dazu hab ich mir ein layout von RelativeLayout abgeleitet und darin ein TextView und ein EditText eingefügt.

Von dieser Klasse füge ich jetzt n Objekte (n = spieleranzahl) zu meinem hauptlayout hinzu. Wenn ich Mit jetzt das Hauptlayout im debugger angucke sind die elemente auch dadrinnen, werden aber nicht angezeigt :(

CustomKlasse:
Code:
//Paketnamen und nen import entfernt

import android.content.Context;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;


public class PlayerCreateView extends RelativeLayout {
    private String mPlayerName;
    private int mPlayerID;
    
    private TextView mPlayerCreateText;
    private EditText mPlayerCreateInput;
    
    Context mContext;
    
    public PlayerCreateView(Context context, int id) {
        super(context);
        
        mPlayerID = id;
        mContext = context;
        
        createTextView();
        createEditText();
        
        this.invalidate();
    }
    
    public PlayerCreateView(Context context){
        super(context);
        mContext = context;
    }

    /**
     * Textview erstellen
     */
    public void createTextView(){
        mPlayerCreateText = new TextView(mContext);
        mPlayerCreateText.setId(1);
        
        //Inhalt setzten
        String content = R.string.string_player_constant + ": " + String.valueOf(mPlayerID);
        mPlayerCreateText.setText(content);
        
        //Setze Parameter
        LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        params.setMargins(R.dimen.standard_element_margin_half, R.dimen.standard_element_margin_half, R.dimen.standard_element_margin_half, R.dimen.standard_element_margin_half);

        
        //Füge zu Layout hinzu
        this.addView(mPlayerCreateText, params);
    }
    
    public void createEditText(){
        mPlayerCreateInput = new EditText(mContext);
        mPlayerCreateInput.setId(2);
        
        //Inhalt setzen
        String content = R.string.string_player_constant + " " + String.valueOf(mPlayerID) + " Name";
        mPlayerCreateInput.setText(content);
        
        //Setze Parameter
        LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.RIGHT_OF, mPlayerCreateText.getId());
        params.setMargins(R.dimen.standard_element_margin_half, R.dimen.standard_element_margin_half, R.dimen.standard_element_margin_half, R.dimen.standard_element_margin_half);
        
        //Füge zu Layout hinzu
        this.addView(mPlayerCreateInput, params);
    }
    
    /////Getter/////
    public String getPlayerName() {return mPlayerName;}
    public int getPlayerID() {return mPlayerID;}
    public TextView getPlayerCreateText() {return mPlayerCreateText;}
    public EditText getPlayerCreateInput() {return mPlayerCreateInput;}

    /////Setter/////
    public void setPlayerName(String playerName) {this.mPlayerName = playerName;}
    public void setPlayerID(int playerID) {this.mPlayerID = playerID;}
    public void setPlayerCreateText(TextView playerCreateText) {this.mPlayerCreateText = playerCreateText;}
    public void setPlayerCreateInput(EditText playerCreateInput) {this.mPlayerCreateInput = playerCreateInput;}

    
    
}

Und meine Mainactivity: (bzw das wichtige daraus)

Code:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player_select);
        
        mContext = this;
        mPlayerCountBar = (SeekBar) findViewById(R.id.seek_set_player_count);
        mPlayerCountView = (TextView) findViewById(R.id.tv_player_count);
        mLayout = (RelativeLayout) findViewById(R.id.RelLay_PlayerSelect);
        
        mPlayerView = null;
        

        
        //OnSeekBarChangeListener implementieren um veränderungen der SeekBar abzufragen und daraufhin das Layout zu bauen
        mPlayerCountBar.setOnSeekBarChangeListener(
                new OnSeekBarChangeListener(){
                    public int mPlayerCount;
                    
                    @Override
                    public void onProgressChanged(SeekBar seekbar, int progressValue, boolean fromUser){
                        mPlayerCount = progressValue + 1;
                        
                        String tmpTextViewContent =   (String) mPlayerCountView.getText();
                        char[] tmpTextViewContentArray = tmpTextViewContent.toCharArray();
                        int tmpTextViewContentLength = tmpTextViewContent.length();
                        tmpTextViewContentArray[tmpTextViewContentLength - 1] = String.valueOf(mPlayerCount).charAt(0);
                        
                        tmpTextViewContent = new String(tmpTextViewContentArray);
                        mPlayerCountView.setText(tmpTextViewContent);
                    }
                    
                    @Override
                    public void onStartTrackingTouch(SeekBar seekbar){
                        
                    }
                    
                    @Override
                    public void onStopTrackingTouch(SeekBar seekbar){
                        //TODO: Layout bauen
                        System.out.println("Building Layout...");
                        if(mPlayerView != null){
                            for(int i = 0; i < mPlayerView.length; i++){
                                mLayout.removeView(mPlayerView[i]);
                            }
                        }
                        
                        mPlayerView = new PlayerCreateView[mPlayerCount];
                        
                        for(int i = 0; i < mPlayerCount; i++){
                            mPlayerView[i] = new PlayerCreateView(mContext, i);
                            mPlayerView[i].setId(i);
                            
                            LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                            params.setMargins(0, 0, 0, 0);
                            params.addRule(RelativeLayout.ALIGN_LEFT);
                            if(i >= 1)params.addRule(RelativeLayout.BELOW, mPlayerView[i-1].getId());
                            else{
                                params.addRule(RelativeLayout.BELOW, R.id.tv_player_count);
                                params.setMargins(0, R.dimen.standard_element_margin, 0, 0);
                            }
                            
                            mLayout.addView(mPlayerView[i], params);

                        }

                    }
                    
                    
                });
    }

Hab zwar auchschon rumgesucht, finde aber nich wirklich was :/
Bin jetzt hier davon ausgegangen, dass das wie bei nem normalen viewobjekt geht, scheinbar tut es das nicht. (Denn das hab ich in nem anderen projekt schon hinbekommen)
 
Schon mal versucht mit
mLayout.invalidate() nachdem du alles hinzugefügt hast?
 
jop :/ Ging auch nicht...

ich werd es jetzt heute mal anders versuchen (ohne umweg über extra klasse direkt die Views in mein Hauptlayout einfügen).

ich vermute, dass ich mir das durch das extra layout unnötig schwer mache...
 
So, habs mal auf LinearLayouts umgestellt, bekomm immernoch keine anzeige...

Der wichtige ausschnitt aus der activity

Code:
        mLayout = (LinearLayout) findViewById(R.id.LinLay_PlayerSelect);
        
        mPlayerNameLayout = new LinearLayout[1];
        LayoutInflater inflater = LayoutInflater.from(mContext);
        
        mPlayerNameLayout[0] = (LinearLayout) inflater.inflate(R.layout.player_name_choice, mLayout, true);
        //mLayout.addView(mPlayerNameLayout[0]);
        mLayout.invalidate();

das Layout
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinLay_Player_Name_Choice"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="center_vertical"
        android:layout_marginBottom="@dimen/standard_element_margin_half"
        android:layout_marginLeft="@dimen/standard_element_margin"
        android:layout_marginRight="@dimen/standard_element_margin_half"
        android:layout_marginTop="@dimen/standard_element_margin_half"
        android:text="TextView" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/standard_element_margin_half"
        android:layout_marginLeft="@dimen/standard_element_margin_half"
        android:layout_marginRight="@dimen/standard_element_margin"
        android:layout_marginTop="@dimen/standard_element_margin_half"
        android:layout_weight="1"
        android:ems="10"
        android:hint="@string/string_player_name_constant"
        android:inputType="textNoSuggestions" >

        <requestFocus />
    </EditText>

</LinearLayout>

wenn ich das addView nicht auskommentiere bekomm ich ne runtime exception.
 
Na ohne addView kann aber auch nichts angezeigt werden.

Zeig und mal deine LogCat von der Runtime Exception.
 
Muss sagen, dass ich davon ausgegangen bin, dass inflate das direkt in das rootelement reinpackt^^

die logcat gibt garnix aus, nur der debugger:

Code:
Thread [<1> main] (Suspended (exception RuntimeException))    
    <VM does not provide monitor information>    
    ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2476    
    ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2520    
    ActivityThread.access$600(ActivityThread, ActivityThread$ActivityClientRecord, Intent) line: 162    
    ActivityThread$H.handleMessage(Message) line: 1366    
    ActivityThread$H(Handler).dispatchMessage(Message) line: 99    
    Looper.loop() line: 158    
    ActivityThread.main(String[]) line: 5751    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]    
    Method.invoke(Object, Object...) line: 511    
    ZygoteInit$MethodAndArgsCaller.run() line: 1083    
    ZygoteInit.main(String[]) line: 850    
    NativeStart.main(String[]) line: not available [native method]

falls es wichtig ist: ich debugge auf nem htc one x mit android 4.2.2
 
Zurück
Oben Unten