web-dev-qa-db-fra.com

Comment utiliser getResource.getIdentifier () pour obtenir la mise en page?

J'ai une question, tout le monde.

Je veux utiliser getResource.getIdentifier() pour obtenir mon élément de mise en page en XML (layout/xxx.xml).

Mais je rencontre le message d'erreur "L'ID de ressource # 0x7f070003 type # 0x12 n'est pas valide ...".

Je ne sais pas comment résoudre ce problème.

J'utilise une méthode de retour linéaire.

C'est mon code ci-dessous:

public class MainActivity extends Activity {


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

  getWeekOfDay(2).setBackgroundColor(Color.RED);
 }

 private LinearLayout getWeekOfDay(int n)
 {
  int layoutID = getResources().getIdentifier("layout"+n, "id", getPackageName());
  return (LinearLayout) LayoutInflater.from(this).inflate(layoutID, null);
 }
....
...
..
}

Ma mise en page a de nombreux linéaires, mais le nom est similaire (mise en page1, mise en page2, mise en page3 ...).

Je veux utiliser la méthode d'appel get element de nomination.

mon code de mise en page est ci-dessous:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/LinearLayout1"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    tools:context=".MainActivity" >

    <LinearLayout
        Android:id="@+id/layout1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.37"
        Android:background="#cccccc" >

            <TextView
            Android:id="@+id/TextView03"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="test1" />
    </LinearLayout>

    <LinearLayout
        Android:id="@+id/layout2"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.37"
        Android:background="#cccccc" >

        <TextView
            Android:id="@+id/TextView02"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="test2" />
    </LinearLayout>

    <LinearLayout
        Android:id="@+id/layout3"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.37"
        Android:background="#cccccc" >

        <TextView
            Android:id="@+id/TextView01"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="test3" />
</LinearLayout>

<LinearLayout
    Android:id="@+id/layout4"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_weight="0.37"
    Android:background="#cccccc" >

    <TextView
        Android:id="@+id/textView1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="test4" />

</LinearLayout>

Mais le code Java renverra une erreur.

Le message d'erreur est ci-dessous:

      : FATAL EXCEPTION: main
     : Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testdemo/com.example.testdemo.MainActivity}: Android.content.res.Resources$NotFoundException: Resource ID #0x7f070003 type #0x12 is not valid
     :  at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2194)
     :  at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2229)
     :  at Android.app.ActivityThread.access$600(ActivityThread.Java:139)
     :  at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1261)
     :  at Android.os.Handler.dispatchMessage(Handler.Java:99)
     :  at Android.os.Looper.loop(Looper.Java:154)
     :  at Android.app.ActivityThread.main(ActivityThread.Java:4945)
     :  at Java.lang.reflect.Method.invokeNative(Native Method)
     :  at Java.lang.reflect.Method.invoke(Method.Java:511)
     :  at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:784)
     :  at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:551)
     :  at dalvik.system.NativeStart.main(Native Method)
     : Caused by: Android.content.res.Resources$NotFoundException: Resource ID #0x7f070003 type #0x12 is not valid
     :  at Android.content.res.Resources.loadXmlResourceParser(Resources.Java:2358)
     :  at Android.content.res.Resources.getLayout(Resources.Java:952)
     :  at Android.view.LayoutInflater.inflate(LayoutInflater.Java:394)
     :  at Android.view.LayoutInflater.inflate(LayoutInflater.Java:352)
     :  at com.example.testdemo.MainActivity.getWeekOfDay(MainActivity.Java:25)
     :  at com.example.testdemo.MainActivity.onCreate(MainActivity.Java:19)
     :  at Android.app.Activity.performCreate(Activity.Java:4531)
     :  at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1071)
     :  at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2150)
     :  ... 11 more

Quelqu'un connaît-il ce problème? Comment résoudre ce problème?

21
dickfala

Avec ça:

int layoutID = getResources().getIdentifier("layout"+n, "layout", getPackageName());

vous récupérez essentiellement l'ID d'un fichier de mise en page que vous pouvez gonfler. C'est la version dynamique de

int layoutID = R.layout.layout1;

Ce que vous avez l'intention de faire est de récupérer une vue à partir d'une disposition déjà gonflée. Voilà comment vous le feriez:

int layoutID = getResources().getIdentifier("layout"+n, "id", getPackageName());
return (LinearLayout)findViewById(layoutID);

Voilà la version dynamique de

return (LinearLayout)findViewById(R.id.layout1);
39
Emanuel Moecklin