2017-03-18 43 views
0

我有一個主活動和幾個片段。在每個片段上,我有幾個TextView元素。我想從主活動中改變當前顯示的片段上的TextViews的字體大小。因此,我想使用Listener在currentFragment上保存TextView元素的列表。 但我不知道如何實現這樣的監聽器? 聽衆是否正確地做到這一點?Android的監聽器爲例來保持電流的TextView元件上片段

如果有另一種方式來做到這一點,我想知道。任何答案歡迎。謝謝。

回答

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

您聲明TextViews的列表,並提供給textviews添加到列表中的方法。

而且您還可以提供信號的激活狀態的方法。這種方法將通過文本視圖列表逐個調用您需要的更改。

從您的主要活動中,你將調用fragment.changeListeningTextViews();

這正好在片段:

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 
    } 
} 

在onCreateView您添加文本視圖列表:

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

注:如果是倒過來的時候,你需要的主要活動要監聽來自片段的事件,解決方案將會有所不同,並且它將涉及由主活動實施的自定義偵聽器接口。

+0

我確實有類似你的答案。謝謝 – Yakari

+0

如果我的答案幫助你,請將其標記爲正確。 – Juan