Моя цель состоит в том, чтобы иметь два фрагмента, которые занимают половину экрана сверху вниз. Верхняя половина должна использовать фрагмент для отображения счетчика. Нижняя половина должна использовать фрагмент, чтобы изменить фон на выбранный цвет счетчика из выпадающего списка.
У меня есть интерфейс, выполненный в PaletteFragment
и реализованный в PaletteActivity
. Затем я создал переменную publi c с именем sharedPosition
, которая разделяет положение элемента счетчика, выбранного от PaletteFragment
до CanvasFragment
. CanvasFragment
расширяет PaletteActivity
, поэтому я могу получить sharedPosition
для правильной настройки цвета фрагмента.
Однако, как только я запускаю программу, появляется верхний фрагмент и показывает счетчик просто отлично, но как только я выбрал цвет из счетчика, приложение вылетает. Logcat показывает sharedPoisition
вызывая его. Я не уверен, почему, когда сам файл не жалуется на это.
Так выглядит мой проект, когда я нажимаю на цвет Я хочу, чтобы он изменил фон нижней половины экрана на этот цвет.
PaletteFragment :
package edu.temple.coloractivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentTransaction;
import java.util.Locale;
public class PaletteFragment extends Fragment {
OnColorSelectListener callback;
public void setOnColorSelectListener(OnColorSelectListener callback){
this.callback = callback;
};
public interface OnColorSelectListener{
public int onColorSelected(int position);
}
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public static PaletteFragment newIntance(){
return new PaletteFragment();
}
public PaletteFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment PaletteFragment.
*/
// TODO: Rename and change types and number of parameters
public static PaletteFragment newInstance(String param1, String param2) {
PaletteFragment fragment = new PaletteFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_palette, container, false);
Spinner spinner = (Spinner) view.findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
getActivity(), R.array.myColors, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
ArrayAdapter<CharSequence> stringNames = ArrayAdapter.createFromResource(getActivity(), R.array.myStrings, android.R.layout.simple_spinner_item);
stringNames.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
ArrayAdapter<CharSequence> stringName = ArrayAdapter.createFromResource(getActivity(),R.array.myStrings, android.R.layout.simple_spinner_item);
stringName.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
View v = inflater.inflate(R.layout.fragment_palette,container,false);
spinner = v.findViewById(R.id.spinner);
spinner.setAdapter(new ColorAdapter(getActivity()));
spinner = v.findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if(position == 0){
}
else if(position == 1){
callback.onColorSelected(position);
}else if(position == 2){
callback.onColorSelected(position);
}else if(position == 3){
callback.onColorSelected(position);
}else if(position == 4){
callback.onColorSelected(position);
}else if(position == 5){
callback.onColorSelected(position);
}else if(position == 6){
callback.onColorSelected(position);
}else if(position == 7){
callback.onColorSelected(position);
}else if(position == 8){
callback.onColorSelected(position);
}else if(position == 9){
callback.onColorSelected(position);
}else if(position == 10){
callback.onColorSelected(position);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
return v;
}
//
}
PaletteActivity
package edu.temple.coloractivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import java.util.Locale;
public class PaletteActivity extends AppCompatActivity implements PaletteFragment.OnColorSelectListener{
public int sharedPosition;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onAttachFragment(Fragment fragment){
}
public int onColorSelected(int position) {
sharedPosition = position;
return position;
}
}
CanvasFragment
package edu.temple.coloractivity;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.fragment.app.Fragment;
import java.util.Locale;
public class CanvasFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.activity_main, container, false);
int pos = ((PaletteActivity)getActivity()).sharedPosition;
String CurrentLang = Locale.getDefault().getLanguage();
TextView text = v.findViewById(R.id.newColor);
final FrameLayout newBackground = v.findViewById(R.id.cfrag_container);
System.out.println(Locale.getDefault().getLanguage());
if(pos == 1){
newBackground.setBackgroundResource(R.color.silver);
if(CurrentLang=="es"){
displayColorName(newBackground,pos,text);
}else{
displayColorName(newBackground,pos,text);
}
}else if(pos == 2){
newBackground.setBackgroundResource(R.color.pink);
if(CurrentLang=="es"){
displayColorName(newBackground,pos,text);
}else{
displayColorName(newBackground,pos,text);
}
}else if(pos == 3){
newBackground.setBackgroundResource(R.color.red);
if(CurrentLang=="es"){
displayColorName(newBackground,pos,text);
}else{
displayColorName(newBackground,pos,text);
}
}else if(pos == 4){
newBackground.setBackgroundResource(R.color.orange);
if(CurrentLang=="es"){
displayColorName(newBackground,pos,text);
}else{
displayColorName(newBackground,pos,text);
}
}else if(pos == 5){
newBackground.setBackgroundResource(R.color.yellow);
if(CurrentLang=="es"){
displayColorName(newBackground,pos,text);
}else{
displayColorName(newBackground,pos,text);
}
}else if(pos == 6){
newBackground.setBackgroundResource(R.color.green);
if(CurrentLang=="es"){
displayColorName(newBackground,pos,text);
}else{
displayColorName(newBackground,pos,text);
}
}else if(pos == 7){
newBackground.setBackgroundResource(R.color.blue);
if(CurrentLang=="es"){
displayColorName(newBackground,pos,text);
}else{
displayColorName(newBackground,pos,text);
}
}else if(pos == 8){
newBackground.setBackgroundResource(R.color.indigo);
if(CurrentLang=="es"){
displayColorName(newBackground,pos,text);
}else{
displayColorName(newBackground,pos,text);
}
}else if(pos == 9){
newBackground.setBackgroundResource(R.color.violet);
if(CurrentLang=="es"){
displayColorName(newBackground,pos,text);
}else{
displayColorName(newBackground,pos,text);
}
}else if(pos == 10){
newBackground.setBackgroundResource(R.color.brown);
if(CurrentLang=="es"){
displayColorName(newBackground,pos,text);
}else{
displayColorName(newBackground,pos,text);
}
}
return v;
}
private void displayColorName(View newBackground, int pos, TextView text){
String retrieve[] = getResources().getStringArray(R.array.myStrings);
String color = retrieve[pos];
text.setText(color);
}
}
CanvasActivity
package edu.temple.coloractivity;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Locale;
public class CanvasActivity extends AppCompatActivity {
}
ColorAdapter
package edu.temple.coloractivity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Locale;
public class ColorAdapter extends BaseAdapter {
ArrayList<Integer> colors;
Context context;
public ColorAdapter(Context context){
this.context=context;
colors = new ArrayList<Integer>();
int retrieve []=context.getResources().getIntArray(R.array.myColors);
for(int i:retrieve)
{
colors.add(i);
}
}
@Override
public int getCount() {
return colors.size();
}
@Override
public Object getItem(int args) {
return colors.get(args);
}
@Override
public long getItemId(int args) {
return args;
}
public String getElementFromColors(int position){
String CurrentLang = Locale.getDefault().getLanguage();
if(CurrentLang.equals("es")){
String retrieve[] = context.getResources().getStringArray(R.array.myStrings);
return retrieve[position];
}else{
String retrieve[] = context.getResources().getStringArray(R.array.myStrings);
return retrieve[position];
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=LayoutInflater.from(context);
convertView=inflater.inflate(android.R.layout.simple_spinner_dropdown_item, null);
TextView txv=(TextView)convertView.findViewById(android.R.id.text1);
txv.setBackgroundColor(colors.get(position));
txv.setText(getElementFromColors(position));
return convertView;
}
}