2017-03-24 8 views
0

を変更しない:背景色は、(DialogFragmentのインタフェースを経由して)私が達成しようとしている何

ユーザーが持つDialogFragmentてMainActivityに位置してリストビューに彼の項目の背景色を変更することができます色の4つのオプション。私はこれを達成するためにインターフェイスを使用しています。インターフェイスはDialogFragmentで作成され、ListView自体のアダプタクラスにあるViewHolderに実装されます。

私は何を扱っています:

私はDialogFragmentから色を選択すると、それはがないために、私はリストで作成するすべての新規項目の指定された背景色を設定が、ん既に存在するもの、または(換言すると)新しい色を選択する前に作成されたものです。

コード: DialogFragment:

// Interfaces... 
public interface SetBlueColorListener { 
    void setBlueColorListener(View v); 
} 

public interface SetRedColorListener { 
    void setRedColorListener(View v); 
} 

public interface SetGreenColorListener { 
    void setGreenColorListener(View v); 
} 

public interface SetOrangeColorListener { 
    void setOrangeColorListener(View v); 
} 

// Setting interfaces... 
public void setBlueColorListener(SetBlueColorListener setBlueColorListener) { 
    mSetBlueColorListener = setBlueColorListener; 
} 

public void setRedColorListener(SetRedColorListener setRedColorListener) { 
    mSetRedColorListener = setRedColorListener; 
} 

public void setGreenColorListener(SetGreenColorListener setGreenColorListener) { 
    mSetGreenColorListener = setGreenColorListener; 
} 

public void setOrangeColorListener(SetOrangeColorListener setOrangeColorListener) { 
    mSetOrangeColorListener = setOrangeColorListener; 
} 

public ColorDialogFragment() {} 

private ImageView mBlueImageView; 
private ImageView mRedImageView; 
private ImageView mGreenImageView; 
private ImageView mOrangeImageView; 
private TextView mAcceptColorTextView; 
private SetBlueColorListener mSetBlueColorListener; 
private SetRedColorListener mSetRedColorListener; 
private SetGreenColorListener mSetGreenColorListener; 
private SetOrangeColorListener mSetOrangeColorListener; 
private LinearLayout mLinearLayout; 

ApplicationSettings mApplicationSettings; 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    final Context context = getActivity(); 

    // Creating the builder... 
    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    View dialogView = getActivity().getLayoutInflater().inflate(R.layout.color_dialog, null); 
    builder.setView(dialogView); 

    // Initialize variables... 
    mBlueImageView = (ImageView) dialogView.findViewById(R.id.blueImageView); 
    mRedImageView = (ImageView) dialogView.findViewById(R.id.redImageView); 
    mGreenImageView = (ImageView) dialogView.findViewById(R.id.greenImageView); 
    mOrangeImageView = (ImageView) dialogView.findViewById(R.id.orangeImageView); 
    mAcceptColorTextView = (TextView) dialogView.findViewById(R.id.acceptColorTextView); 
    mLinearLayout = (LinearLayout) dialogView.findViewById(R.id.color_dialog); 

    // Creating the dialog... 
    final AlertDialog dialog = builder.create(); 

    // SharedPreferences (defined in ApplicationSettings) 
    mApplicationSettings = new ApplicationSettings(context); 
    String color = mApplicationSettings.getColorPreference(); 

    if (color.equals(ColorSettings.BLUE)) { 
     mLinearLayout.setBackgroundResource(R.color.defaultBlue); 
     mAcceptColorTextView.setBackgroundResource(R.drawable.blue_lists_selector_rectangle); 
    } 

    if (color.equals(ColorSettings.RED)) { 
     mLinearLayout.setBackgroundResource(R.color.defaultRed); 
     mAcceptColorTextView.setBackgroundResource(R.drawable.red_lists_selector_rectangle); 
    } 

    if (color.equals(ColorSettings.GREEN)) { 
     mLinearLayout.setBackgroundResource(R.color.defaultGreen); 
     mAcceptColorTextView.setBackgroundResource(R.drawable.green_lists_selector_rectangle); 
    } 

    if (color.equals(ColorSettings.ORANGE)) { 
     mLinearLayout.setBackgroundResource(R.color.defaultOrange); 
     mAcceptColorTextView.setBackgroundResource(R.drawable.orange_lists_selector_rectangle); 
    } 

    // OnClickListeners... 
    mBlueImageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      mSetBlueColorListener.setBlueColorListener(view); 
      mLinearLayout.setBackgroundResource(R.color.defaultBlue); 
      mApplicationSettings.setColorPreference(ColorSettings.BLUE); 
      mAcceptColorTextView.setBackgroundResource(R.drawable.blue_lists_selector_rectangle); 
     } 
    }); 

    mRedImageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      mSetRedColorListener.setRedColorListener(view); 
      mLinearLayout.setBackgroundResource(R.color.defaultRed); 
      mApplicationSettings.setColorPreference(ColorSettings.RED); 
      mAcceptColorTextView.setBackgroundResource(R.drawable.red_lists_selector_rectangle); 
     } 
    }); 

    mGreenImageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      mSetGreenColorListener.setGreenColorListener(view); 
      mLinearLayout.setBackgroundResource(R.color.defaultGreen); 
      mApplicationSettings.setColorPreference(ColorSettings.GREEN); 
      mAcceptColorTextView.setBackgroundResource(R.drawable.green_lists_selector_rectangle); 
     } 
    }); 

    mOrangeImageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      mSetOrangeColorListener.setOrangeColorListener(view); 
      mLinearLayout.setBackgroundResource(R.color.defaultOrange); 
      mApplicationSettings.setColorPreference(ColorSettings.ORANGE); 
      mAcceptColorTextView.setBackgroundResource(R.drawable.orange_lists_selector_rectangle); 
     } 
    }); 

    mAcceptColorTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      dialog.dismiss(); 
     } 
    }); 

    return dialog; 
} 

アダプタ:

private ArrayList<ListItem> mListsList; 
private OpenDeleteDialogListClickListener mOpenDeleteDialogListClickListener; 

public ListsAdapter(OpenDeleteDialogListClickListener deleteListClickListener, ArrayList<ListItem> list) { 
    mOpenDeleteDialogListClickListener = deleteListClickListener; 
    mListsList = list; 
} 

@Override 
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.list_list_item, parent, false); 
    ListViewHolder viewHolder = new ListViewHolder(view); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(ListViewHolder holder, int position) { 
    holder.bindList(mListsList.get(position)); 
} 

@Override 
public int getItemCount() { 
    return mListsList.size(); 
} 

public class ListViewHolder extends RecyclerView.ViewHolder implements ColorDialogFragment.SetBlueColorListener, 
     ColorDialogFragment.SetGreenColorListener, ColorDialogFragment.SetRedColorListener, 
     ColorDialogFragment.SetOrangeColorListener { 

    public TextView mListNameTextView; 
    public ImageView mDeleteListImageView; 

    ApplicationSettings mApplicationSettings; 

    public ListViewHolder(View itemView) { 
     super(itemView); 

     mListNameTextView = (TextView) itemView.findViewById(R.id.listNameTextView); 
     mDeleteListImageView = (ImageView) itemView.findViewById(R.id.deleteListImageView); 

     // SharedPreferences (defined in ApplicationSettings) 
     mApplicationSettings = new ApplicationSettings(itemView.getContext()); 
     String color = mApplicationSettings.getColorPreference(); 

     if (color.equals(ColorSettings.BLUE)) { 
      mListNameTextView.setBackgroundResource(R.drawable.blue_lists_selector_rectangle); 
      mDeleteListImageView.setBackgroundResource(R.drawable.blue_lists_selector); 
     } 

     if (color.equals(ColorSettings.RED)) { 
      mListNameTextView.setBackgroundResource(R.drawable.red_lists_selector_rectangle); 
      mDeleteListImageView.setBackgroundResource(R.drawable.red_lists_selector); 
     } 

     if (color.equals(ColorSettings.GREEN)) { 
      mListNameTextView.setBackgroundResource(R.drawable.green_lists_selector_rectangle); 
      mDeleteListImageView.setBackgroundResource(R.drawable.green_lists_selector); 
     } 

     if (color.equals(ColorSettings.ORANGE)) { 
      mListNameTextView.setBackgroundResource(R.drawable.orange_lists_selector_rectangle); 
      mDeleteListImageView.setBackgroundResource(R.drawable.orange_lists_selector); 
     } 

     mDeleteListImageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mOpenDeleteDialogListClickListener.openDeleteDialogListClickListener(view, getAdapterPosition()); 
      } 
     }); 
    } 

    public void bindList(ListItem item) { 
     mListNameTextView.setText(item.getListName()); 
    } 

    @Override 
    public void setBlueColorListener(View v) { 
     mListNameTextView.setBackgroundResource(R.drawable.blue_lists_selector_rectangle); 
     mDeleteListImageView.setBackgroundResource(R.drawable.blue_lists_selector); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void setRedColorListener(View v) { 
     mListNameTextView.setBackgroundResource(R.drawable.red_lists_selector_rectangle); 
     mDeleteListImageView.setBackgroundResource(R.drawable.red_lists_selector); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void setGreenColorListener(View v) { 
     mListNameTextView.setBackgroundResource(R.drawable.green_lists_selector_rectangle); 
     mDeleteListImageView.setBackgroundResource(R.drawable.green_lists_selector); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void setOrangeColorListener(View v) { 
     mListNameTextView.setBackgroundResource(R.drawable.orange_lists_selector_rectangle); 
     mDeleteListImageView.setBackgroundResource(R.drawable.orange_lists_selector); 
     notifyDataSetChanged(); 
    } 
} 
+0

なぜ各色のインターフェイスが必要ですか? –

+0

フルコードを貼り付けてください –

+0

あなたの質問は不明です。 DialogFragmentにはListViewがありますか?あれは正しいですか??そして、あなたはlistViewアイテムで色を設定したいですか? –

答えて

1

あなたのアクティビティコード:

@Override 
public void onBindViewHolder(ListViewHolder holder, int position){ 

    holder.mListNameTextView.setText(mListsList.get(position).getListName()); 

    // Set the color 
    switch(mColor){ 
     case "Blue": 
      holder.mListNameTextView.setBackgroundResource(R.drawable.blue_lists_selector_rectangle); 
      holder.mDeleteListImageView.setBackgroundResource(R.drawable.blue_lists_selector); 
      break; 
     case "Red": 
      holder.mListNameTextView.setBackgroundResource(R.drawable.red_lists_selector_rectangle); 
      holder.mDeleteListImageView.setBackgroundResource(R.drawable.red_lists_selector); 
      break; 
     default: 
      // Set whatever the default color should be 
      break; 
    } 
} 

次に、あなたのアダプタの内部が、あなたのViewHolderの外に、「青」や「赤」のような文字列に色を設定し、リフレッシュするアダプタを通知するヘルパー関数を定義します。

public void setColor(String color){ 
    mColor = color; 
    notifyDataSetChanged; 
} 

あなたがしているどこあなたのアダプタを使用してmyAdapter.setColor("Blue")と呼ぶだけで、例えば色を青に変えることができます。

0

私の仮定は、すべての色のリスナーを設定する必要はありません。

  • ダイアログの最終カラーを取得するだけです。つまり、ユーザーは複数の色を選択できますが、最後の色のみを選択できます。この目的のためにDialog Dismiss listenerを使用してください。

    ColorDialogFragment extends DialogFragment{ 
        int color =-1; 
    
        //do your stuff for setting color 
    
        @Override 
         public void onDismiss(final DialogInterface dialog) { 
          super.onDismiss(dialog); 
          if(color != -1){ 
          final Activity activity = getActivity(); 
          if (activity instanceof ColorChangeListener) { 
           ((ColorChangeListener)activity).onDismiss(dialog); 
          } 
    
          } 
         } 
    
    
        } 
    

//つのインタフェースを定義し

interface ColorChangeListener{ 
void onColorChange(int color); 
} 

私はこのようなonBindViewHolderに色を設定します

class YourActivity extends AppCompatActivity implements ColorChangeListener{ 

void onColorChange(int color){ 
//Now you got the color that you need. Do whatever you want 
yourAdpater.notifyDataSetChanged(); 
} 

} 
関連する問題