1

Здесь мне нужно добавить textview во время выполнения. Сначала я взял ссылку на RelativeLayout, чтобы получить макет Params, но к сожалению его метания ClassCastException в RelativeLayout.LayoutParams Params = (android.widget.RelativeLayout.LayoutParams) contentLayout.getLayoutParams()

Я также проверил - FrameLayout to RelativeLayout ClassCastException even if there is no FrameLayout used, но Бесполезный Не работай. Поскольку после замены RelativeLayout с помощью FrameLayout, я не могу добавить правило в layoutParams.

protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      TextView displayTextView = (TextView)findViewById(R.id.display_text); 

      ContentResolver resolver = getContentResolver(); 
      Cursor cursor = resolver.query(UserDictionary.Words.CONTENT_URI, null, null, null, null); 

      cursor.moveToFirst(); 
      displayTextView.setText("The User Dictionary contains " + cursor.getColumnCount() + " words"); 

      RelativeLayout contentLayout = (RelativeLayout)findViewById(R.id.content_layout); 

      TextView columnNames = new TextView(this); 
      columnNames.setText("Columns: _id - frequency - word"); 
      contentLayout.addView(columnNames); 

      RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams)contentLayout.getLayoutParams(); 
      params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
      params.addRule(RelativeLayout.BELOW); 

      do{ 
       TextView entry = new TextView(this); 
       entry.setText(cursor.getInt(cursor.getColumnIndex(UserDictionary.Words._ID)) + " - " + 
           cursor.getInt(cursor.getColumnIndex(UserDictionary.Words.FREQUENCY)) + " - " + 
           cursor.getString(cursor.getColumnIndex(UserDictionary.Words.WORD))); 

       entry.setLayoutParams(params); 
       contentLayout.addView(entry); 
      }while(cursor.moveToNext()); 

      cursor.close(); 
    } 

    **Getting following error** - 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dexter.contentpro/com.example.dexter.contentpro.MainActivity}: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams 
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
       at android.app.ActivityThread.access$800(ActivityThread.java:144) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:135) 
       at android.app.ActivityThread.main(ActivityThread.java:5221) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at java.lang.reflect.Method.invoke(Method.java:372) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
     Caused by: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams 
       at com.example.dexter.contentpro.MainActivity.onCreate(MainActivity.java:37) 
       at android.app.Activity.performCreate(Activity.java:5933) 
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
                at android.app.ActivityThread.access$800(ActivityThread.java:144) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
                at android.os.Handler.dispatchMessage(Handler.java:102) 
                at android.os.Looper.loop(Looper.java:135) 
                at android.app.ActivityThread.main(ActivityThread.java:5221) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at java.lang.reflect.Method.invoke(Method.java:372) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

activity_main.xml-

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/content_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <TextView 
     android:id="@+id/display_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</RelativeLayout> 
+0

Согласно вашему коду все выглядит нормально. Удалите R.java и перекомпилируйте его и запустите снова. В идеале вы должны использовать Relative Layout, а не Frame. – theJango

ответ

3

Ошибка прав, и вы тоже правы, но его неправильное толкование на Вас и часть андроида. Вы видите, когда вы Inflate а View с Parent_View быть любой суб класс ViewGroup, андроид возвращает этот View и относиться к нему как View, если вы хотите, чтобы рассматривать его как подкласс ViewGroup вы собираетесь иметь несколько литых Excetpions ... Вы видите, что я знаю это на опыте, но я не могу дать вам документальный факт об этом

Назад к вопросу; Вы пытаетесь получить Layoutparams из ваших RelativeLayout который является самым верхним View этого XML, так что я имею в виде getLayoutParams() должен возвращать null, так как его не привязанные к ViewGroup, но его не что означает его привязанный к FrameLayout, который является самым наиболее View для Window или самого себя.

Для ее решения

попробовать это (1)

вместо того, чтобы использовать эту линию

RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) 
          contentLayout.getLayoutParams(); 

использование этого

//get the layoutParams of the TextView child in the Relativelayout in 
//your xml,this will automatically map to the RelativeLayout params 
RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) 
          displayTextView.getLayoutParams();  

или использовать этот (2)

изменения только ваш XML, и ваш предыдущий код будет работать нормально

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools"  
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context=".MainActivity"> 

    <RelativeLayout 
     android:id="@+id/content_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 

     <TextView 
      android:id="@+id/display_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

    </RelativeLayout> 
</RelativeLayout> 
+0

Thankyou так много. Потрясающие! Это сработало. –

+0

вы можете поддержать, если это поможет сэру, @ VikramBhati – Elltz

Смежные вопросы