2017-08-12 1 views
1

Ich bin neu bei Android.Ich möchte die Sprache meiner Liste Elemente von Recyclerview ändern. Meine Listenelemente werden in einem String-Array in Werten gespeichert. Wie kann ich die Sprache von Listenelementen auf den Klick eines Listenelements ändern? Hier ist der Code es versucht, aber ich habe Fehler. Kann jemand bitte meinen Fehler korrigieren oder mir den richtigen Weg zeigen, um das gewünschte Ergebnis zu erreichen.android: - Wie ändert man die Sprache von Listenelementen von recyclerview?

Fehler: -

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
        at com.example.chaitanya.kundli.MainActivity.setLocale(MainActivity.java:60) 
        at com.example.chaitanya.kundli.RecyclerViewAdapter$1.onClick(RecyclerViewAdapter.java:66) 
        at android.view.View.performClick(View.java:4759) 
        at android.view.View$PerformClick.run(View.java:19770) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5237) 
        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:912) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707) 

MainActivity.java

public class MainActivity extends AppCompatActivity { 
android.content.res.Resources res; 

RecyclerView recyclerView; 

Context context; 
String[] numbers; 

RecyclerView.Adapter recyclerView_Adapter; 

RecyclerView.LayoutManager recyclerViewLayoutManager; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    res = getResources(); 

    numbers = res.getStringArray(R.array.abc); 
    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
    getSupportActionBar().setCustomView(R.layout.action_bar); 

    context = getApplicationContext(); 

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view1); 

    //Change 2 to your choice because here 2 is the number of Grid layout Columns in each row. 
    recyclerViewLayoutManager = new GridLayoutManager(context, 2); 

    recyclerView.setLayoutManager(recyclerViewLayoutManager); 

    recyclerView_Adapter = new RecyclerViewAdapter(context,numbers); 

    recyclerView.setAdapter(recyclerView_Adapter); 

} 
public void setLocale(String lang) { 
    Locale myLocale = new Locale(lang); 
    Resources res = context.getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Intent refresh = new Intent(this, MainActivity.class); 
    startActivity(refresh); 
    finish(); 
} 
} 

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{ 

String[] values; 
Context context1; 

public RecyclerViewAdapter(Context context2,String[] values2){ 

    values = values2; 

    context1 = context2; 
} 

public static class ViewHolder extends RecyclerView.ViewHolder{ 

    public TextView textView; 

    public ViewHolder(View v){ 

     super(v); 

     textView = (TextView) v.findViewById(R.id.textview1); 

    } 
} 

@Override 
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 

    View view1 = LayoutInflater.from(context1).inflate(R.layout.recycler_view_items,parent,false); 

    ViewHolder viewHolder1 = new ViewHolder(view1); 

    return viewHolder1; 
} 

@Override 
public void onBindViewHolder(ViewHolder Vholder,final int position){ 

    Vholder.textView.setText(values[position]); 

    Vholder.textView.setBackgroundColor(Color.parseColor("#ffc947")); 

    Vholder.textView.setTextColor(Color.BLACK); 
    Vholder.textView.setBackgroundResource(R.drawable.rounded_corner); 

    Vholder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      MainActivity aa = new MainActivity(); 
      if(position == 4){ 
       aa.setLocale("hi");//calling function 
      } 
     } 
    }); 

} 

@Override 
public int getItemCount(){ 

    return values.length; 
} 
} 

string.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="app_name">nnn</string> 
<string-array name="abc"> 
    <item>Query</item> 
    <item>Answers</item> 
    <item>Rate Us</item> 
    <item>Change Language</item> 
    <item>Logout</item> 
</string-array> 
</resources> 

string.xml (hallo)

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="app_name">nnn</string> 
<string-array name="abc"> 
    <item>सवाल पूछें </item> 
    <item>उत्तर देखें</item> 
    <item>रेटिंग दीजिये</item> 
    <item>भाषा बदलें</item> 
    <item>बाहर निकलें</item> 
</string-array> 
</resources> 
+0

Welche Linie verursacht die NPE? –

Antwort

1

Aktivitäten Schöpfung Griff durch das System sollten Sie nicht new WhateverActivity() nennen.

Stattdessen können Sie eine Schnittstelle als Hörer verwenden, zB:

localeListener.java

public interface LocaleListener { 
    void setLocale(String values) 
} 

In Ihrem Adapter eine localeListener Variable und einen Setter erstellen:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{ 

     String[] values; 
     Context context1; 
     private LocaleListener mListener; //some change here 

     public RecyclerViewAdapter(Context context2,String[] values2){ 

      values = values2; 

      context1 = context2; 
     } 

     public static class ViewHolder extends RecyclerView.ViewHolder{ 

      public TextView textView; 

      public ViewHolder(View v){ 

       super(v); 

       textView = (TextView) v.findViewById(R.id.textview1); 

      } 
     } 

    @Override 
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 

     View view1 = LayoutInflater.from(context1).inflate(R.layout.recycler_view_items,parent,false); 

     ViewHolder viewHolder1 = new ViewHolder(view1); 

     return viewHolder1; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder Vholder,final int position){ 

     Vholder.textView.setText(values[position]); 

     Vholder.textView.setBackgroundColor(Color.parseColor("#ffc947")); 

     Vholder.textView.setTextColor(Color.BLACK); 
     Vholder.textView.setBackgroundResource(R.drawable.rounded_corner); 

     Vholder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(position == 4 && mListener != null){ // some change here 
        mListener.setLocale("hi");//calling function 
       } 
      } 
     }); 

     } 

    @Override 
    public int getItemCount(){ 

     return values.length; 
    } 

    //some change here 
    public void setLocaleListener(LocaleListener listener) { 
     mListener = listener 
    } 
} 

Schließlich stellen Sie Ihre Aktivität als localeListener:

public class MainActivity extends AppCompatActivity implements LocaleListener{ 
    android.content.res.Resources res; 

    RecyclerView recyclerView; 

    Context context; 
    String[] numbers; 

    RecyclerView.Adapter recyclerView_Adapter; 

    RecyclerView.LayoutManager recyclerViewLayoutManager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
     res = getResources(); 

     numbers = res.getStringArray(R.array.abc); 

     getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
     getSupportActionBar().setCustomView(R.layout.action_bar); 

     context = getApplicationContext(); 

     recyclerView = (RecyclerView) findViewById(R.id.recycler_view1); 

    //Change 2 to your choice because here 2 is the number of Grid layout Columns in each row. 
     recyclerViewLayoutManager = new GridLayoutManager(context, 2); 

     recyclerView.setLayoutManager(recyclerViewLayoutManager); 

     recyclerView_Adapter = new RecyclerViewAdapter(context,numbers); 

     recyclerView_Adapter.setLocaleListener(this); // some change here 

     recyclerView.setAdapter(recyclerView_Adapter); 

    } 

    @Override 
    public void setLocale(String lang) { 
     Locale myLocale = new Locale(lang); 
     Resources res = context.getResources(); 
     DisplayMetrics dm = res.getDisplayMetrics(); 
     Configuration conf = res.getConfiguration(); 
     conf.locale = myLocale; 
     res.updateConfiguration(conf, dm); 
     Intent refresh = new Intent(this, MainActivity.class); 
     startActivity(refresh); 
     finish(); 
    } 
} 

Hoffnung, das hilft.

+0

Fehler beim Aufruf von setLocaleListener in der Hauptaktivität. –

+0

Was ist der Fehler? – Cochi

+0

kann die Methode 'setLocaleListener (com ..... MainActivity) nicht auflösen' –

1

Sie die MainActivity, nicht neu, sondern ein Interface zu aktualisieren, um die Sprache zu erstellen.

Schnittstelle

public interface RecyclerViewOnClickListenerHack { 

    void onLanguage(String language); 
} 

MainActivity

public class MainActivity extends AppCompatActivity implements RecyclerViewOnClickListenerHack { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 

     recyclerView_Adapter = new RecyclerViewAdapter(context,numbers); 
     recyclerView_Adapter.setmRecyclerViewOnClickListenerHack(this) 
     recyclerView.setAdapter(recyclerView_Adapter); 
    } 

    @Override 
     public void onLanguage(String language) { 
      setLocale(String language) 
     } 

} 

RecyclerViewAdapter

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{ 

    private RecyclerViewOnClickListenerHack mRecyclerViewOnClickListenerHack; 

    public void setmRecyclerViewOnClickListenerHack(RecyclerViewOnClickListenerHack r) { 
     this.mRecyclerViewOnClickListenerHack = r; 
    } 


    @Override 
    public void onBindViewHolder(ViewHolder Vholder,final int position){ 
     ... 
     Vholder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(position == 4){ 
       RecyclerViewOnClickListenerHack.onLanguage("hi");//calling function 
       } 
      } 
     }); 
    } 

} 
0

Ich bin nicht sicher über e Rror, wenn möglich teilen Sie bitte GITHUB link.Aber ich denke, ich helfe in der gleichen, ich habe versucht, zwei Möglichkeiten, dies zu tun.

1) Sie müssen Ihre Telefonsprache zu Hindi ändern und versuchen, Ihre App zu laden, wird es hindi Inhalt laden.

2) Sie wollen nur die Sprache in der App ändern (was nicht ratsam)

Bitte meinen Link Github finden, wo ich zwei meiner Projekte aktualisiert. Sie können auf Projekt 15 für die lokale Sprache verweisen. und Projekt 16, um die Sprache in Ihrer App zu ändern. Android Mini Apps

Dank Ashish

Verwandte Themen