2017-03-18 1 views
0

私は主なアクティビティと複数のフラグメントを持っています。各断片には、いくつかのTextView要素があります。メインアクティビティから現在表示されているフラグメントのTextViewsのフォントサイズを変更したい。したがって、Listenerを使用してcurrentFragmentにTextView要素のリストを保持する必要があります。 しかし、そのようなリスナーの実装方法はわかりません。 リスナーはそれを正しい方法で行いますか?フラグメントの現在のTextView要素を保持するAndroidリスナーの例

これを達成する別の方法がある場合、私は知りたいと思っていました。どんな答えも歓迎です。ありがとう。

答えて

0

以下のように実装しました。それはうまく動作しますが、私はどのくらい明確な解決策であるか分かりません。

public class MainActivity extends AppCompatActivity { 

protected void onCreate(Bundle savedInstanceState) { 

// 

} 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action buttons 
     switch(item.getItemId()) { 
      case R.id.smallFontSize: 
       FontSizeHelper.updateFontSize(Constants.fontSize1); 
      return true; 
      case R.id.mediumFontSize: 
       FontSizeHelper.updateFontSize(Constants.fontSize2); 
       return true; 
      case R.id.largeFontSize: 
       FontSizeHelper.updateFontSize(Constants.fontSize3); 
       return true; 
      case R.id.extraLargeFontSize: 
       FontSizeHelper.updateFontSize(Constants.fontSize4); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 
} 


public class FontSizeHelper { 

    public static List<View> viewElements = new ArrayList<>(); 

    public static void initFontElements(){ 
     viewElements = new ArrayList<>(); 
    } 

    public static void addFontEelements(View view){ 
     viewElements.add(view); 
    } 

    public static void updateFontSize(int fontSize){ 
     for(View v : viewElements){ 
      if(v instanceof TextView){ 
       ((TextView) v).setTextSize(fontSize); 
      } 
     } 
    } 
} 
public class FragmentA extends Fragment { 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View rootView = inflater.inflate(R.layout.a_fragment, container, false); 
//initialize empty list for View objects. 
     FontSizeHelper.initFontElements(); 

//add View object/TextViews into list 
FontSizeHelper.addViewEelements(textView1); 
FontSizeHelper.addViewEelements(textView2); 
FontSizeHelper.addViewEelements(textView3); 
//..etc 
}} 
0

あなたの質問が正しい場合は、メインアクティビティから現在のフラグメントのTextViewオブジェクトにアクセスし、setTextSize()メソッドを使用することができます。

+0

これで、現在表示されているフラグメントのオブジェクトにメインアクティビティからアクセスできます。しかし、私は今FontSizeHelperクラスを実装して、textViewオブジェクトを保持しています。私のようなこの方法ははっきりと分かります。しかし、私が考えるより良い方法があるはずです。 – Yakari

+0

あなたの状況をよりよく理解できるように、いくつかのコードを投稿してください。 – Shanky

0

TextViewのリストを宣言し、テキストビューをリストに追加する方法を提供します。

また、アクティベーション状態を通知する方法も提供します。このメソッドは、必要な変更を1つずつ呼び出すtextviewのリストを調べます。

主なアクティビティから、fragment.changeListeningTextViews()を呼び出します。

これは、フラグメントに行く:

リストにテキストビューを追加onCreateViewで
private ArrayList<TextView> listeningTextViews; 

public void addListeningTextview(TextVew tv){ 
    //Here check if the text view is already added not to add it twice. 

    listeningTextViews.add(tv); 
} 

public void changeListeningTextViews(){ 
    for(TextView tv : listeningTextViews){ 
     tv.setFont(...); 
     //What you want called on each TextVeiw 
    } 
} 

TextView textView1 = (TextView) rootView.findViewById(R.id.aview); 
addListeningTestview(textView1); 
TextView textView2 = (TextView) rootView.findViewById(R.id.anotherview); 
addListeningTestview(textView2); 
... 

注:それは他の方法でラウンドした場合は、主な活動を必要とするときフラグメントから来るイベントをリッスンするには、解決策は異なり、メインアクティビティによって実装されるカスタムリスナインターフェイスが必要になります。

+0

私は実際にあなたの答えのような何かをしました。ありがとう – Yakari

+0

私の答えがあなたを助けたなら、それを正しいものとしてマークしてください。 – Juan

関連する問題