如何设置 xml 元素在通过寻呼机适配器创建的片段中的可见性?
How can I set the visibility for a xml element inside a fragment created via pager adapter?
我有这个 activity 可以实例化 5 个代表乘客的不同片段,并将它们添加到选项卡中的视图寻呼机中。其中每一个都会膨胀相同的 xml 文件。我想要做的是能够根据乘客的类型设置每个片段中某些 xml 字段的可见性。我根据选项卡名称识别乘客类型。
例如:'etDataNasc' 字段必须仅在乘客类型为 'INF' 时出现。
当我实例化片段时,我将它们放在片段数组中并检查对应的选项卡名称是否具有我想要的条件(最后有'INF')。如果是这样,我想从该片段访问 etDataNasc 字段并将其可见性设置为 VISIBLE,否则它必须是 INVISIBLE。
我在这里做了一些关于 Whosebug 的研究,但找不到任何对我有特别帮助的东西。基于对类似问题的一些回答,我尝试在 newInstance 方法中扩充布局,但是当尝试在我的 activity 上设置它的可见性时,它仍然显示每个乘客的字段!
抱歉这个问题很长,但我们将不胜感激。
这是我的 Activity 代码(与我的问题相关的部分):
public class DadosPassageirosActivity extends android.support.v7.app.ActionBarActivity {
Toolbar toolbar;
private android.support.v7.app.ActionBar bar;
ViewPager pager;
ViewPagerPassageirosAdapter pagerAdapter;
SlidingTabLayout tabs;
CharSequence Titles[];
private int nTitlesPassageiros = 1;
public int nAdultos, nCriancas, nBebes, nPassageiros;
private Passageiro[] passageirosArray;
private int arrayControl = 0;
private DrawerLayout filtrosDrawerLayout;
private ListView drawerList;
public DadosPassageirosFragment[] passageiroFragment;
public Button btnProsseguir;
static boolean isInf;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dados_passageiros);
// Creating The Toolbar and setting it as the Toolbar for the activity
toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
bar = getSupportActionBar();
bar.setDisplayHomeAsUpEnabled(true);
Intent intent = getIntent();
nAdultos = intent.getExtras().getInt("nAdultos");
nCriancas = intent.getExtras().getInt("nCriancas");
nBebes = intent.getExtras().getInt("nBebes");
nPassageiros = intent.getExtras().getInt("nPassageiros");
passageirosArray = new Passageiro[nPassageiros];
passageiroFragment = new DadosPassageirosFragment[nPassageiros];
Titles = new CharSequence[nPassageiros];
int i;
for (i=0; i<nPassageiros; i++){
Titles[i] = nTitlesPassageiros + "° Passageiro" + " (ADT)";
nTitlesPassageiros +=1;
}
if (nCriancas > 0){
for (i=nCriancas; i>0; i--){
Titles[(Titles.length-i)-nBebes] = Titles[(Titles.length-i)-nBebes].subSequence(0,13) + " (CHD)";
}
}
if (nBebes >0){
for (i=nBebes; i>0; i--){
Titles[Titles.length-i] = Titles[Titles.length-i].subSequence(0,13) + " (INF)";
}
}
// Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
pagerAdapter = new ViewPagerPassageirosAdapter(getSupportFragmentManager(),Titles,nPassageiros, this);
// Assigning ViewPager View and setting the adapter
pager = (NonSwipeableViewPager) findViewById(R.id.pager);
pager.setAdapter(pagerAdapter);
for (i=0; i<nPassageiros; i++){
passageiroFragment[i] = (DadosPassageirosFragment)pagerAdapter.getItem(i);
getTabName(i);
}
}
public void getTabName(int pos){
CharSequence title = pagerAdapter.getPageTitle(pos);
if (title.subSequence(title.length()-4, title.length()-1).equals("INF")){
passageiroFragment[pos].etDataNasc.setVisibility(View.VISIBLE);
}
else {
passageiroFragment[pos].etDataNasc.setVisibility(View.INVISIBLE);
}
}
}
这是我的适配器:
public class ViewPagerPassageirosAdapter extends FragmentStatePagerAdapter {
Context mContext;
CharSequence Titles[]; // This will Store the Titles of the Tabs which are Going to be passed when ViewPagerAdapter is created
int NumbOfTabs; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created
// Build a Constructor and assign the passed Values to appropriate values in the class
public ViewPagerPassageirosAdapter(FragmentManager fm,CharSequence mTitles[], int mNumbOfTabsumb, Context c) {
super(fm);
this.Titles = mTitles;
this.NumbOfTabs = mNumbOfTabsumb;
this.mContext = c;
}
//This method return the fragment for the every position in the View Pager
@Override
public Fragment getItem(int position) {
DadosPassageirosFragment tab = DadosPassageirosFragment.newInstance(this.mContext);
return tab;
}
// This method return the titles for the Tabs in the Tab Strip
@Override
public CharSequence getPageTitle(int position) {
return Titles[position];
}
// This method return the Number of tabs for the tabs Strip
@Override
public int getCount() {
return NumbOfTabs;
}
}
这里是使用实例方法的片段本身:
public class DadosPassageirosFragment extends Fragment {
static EditText etNome, etSobrenome, etEmail;
TextView aviso;
public EditText etDataNasc;
DadosPassageirosActivity dadosPassageiros;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_form_passageiro, container, false);
dadosPassageiros = (DadosPassageirosActivity)getActivity();
etNome = (EditText)v.findViewById(R.id.formPassageirosNome);
//etSobrenome = (EditText)v.findViewById(R.id.formPassageirosSobrenome);
//etEmail = (EditText)v.findViewById(R.id.formPassageirosEmail);
etDataNasc = (EditText)v.findViewById(R.id.formPassageirosDataNasc);
return v;
}
public static DadosPassageirosFragment newInstance(Context c){
DadosPassageirosFragment f = new DadosPassageirosFragment();
LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.fragment_form_passageiro, null, false);
f.etDataNasc = (EditText)v.findViewById(R.id.formPassageirosDataNasc);
return f;
}
}
这是一个很长的解决方案,如果您有什么不明白的地方,请问我..
在 DadosPassageirosFragment
添加一个布尔值来决定对象是否应该可见..
boolean isVisible;
在主 Activity 上创建所有片段并根据您的需要更新 isVisible var..
将所有片段发送到适配器,不要在片段内创建它们,只需return根据所选位置正确。
public ViewPagerPassageirosAdapter(`DadosPassageirosFragment[] fragments`...
当系统构建每个 Fragment 时,它会检查 isVisible var 和 shows/hide 这个 EditText
使用 onStart()
函数来 VISIBLE/INVISIBLE EditText
我有这个 activity 可以实例化 5 个代表乘客的不同片段,并将它们添加到选项卡中的视图寻呼机中。其中每一个都会膨胀相同的 xml 文件。我想要做的是能够根据乘客的类型设置每个片段中某些 xml 字段的可见性。我根据选项卡名称识别乘客类型。
例如:'etDataNasc' 字段必须仅在乘客类型为 'INF' 时出现。
当我实例化片段时,我将它们放在片段数组中并检查对应的选项卡名称是否具有我想要的条件(最后有'INF')。如果是这样,我想从该片段访问 etDataNasc 字段并将其可见性设置为 VISIBLE,否则它必须是 INVISIBLE。
我在这里做了一些关于 Whosebug 的研究,但找不到任何对我有特别帮助的东西。基于对类似问题的一些回答,我尝试在 newInstance 方法中扩充布局,但是当尝试在我的 activity 上设置它的可见性时,它仍然显示每个乘客的字段!
抱歉这个问题很长,但我们将不胜感激。
这是我的 Activity 代码(与我的问题相关的部分):
public class DadosPassageirosActivity extends android.support.v7.app.ActionBarActivity {
Toolbar toolbar;
private android.support.v7.app.ActionBar bar;
ViewPager pager;
ViewPagerPassageirosAdapter pagerAdapter;
SlidingTabLayout tabs;
CharSequence Titles[];
private int nTitlesPassageiros = 1;
public int nAdultos, nCriancas, nBebes, nPassageiros;
private Passageiro[] passageirosArray;
private int arrayControl = 0;
private DrawerLayout filtrosDrawerLayout;
private ListView drawerList;
public DadosPassageirosFragment[] passageiroFragment;
public Button btnProsseguir;
static boolean isInf;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dados_passageiros);
// Creating The Toolbar and setting it as the Toolbar for the activity
toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
bar = getSupportActionBar();
bar.setDisplayHomeAsUpEnabled(true);
Intent intent = getIntent();
nAdultos = intent.getExtras().getInt("nAdultos");
nCriancas = intent.getExtras().getInt("nCriancas");
nBebes = intent.getExtras().getInt("nBebes");
nPassageiros = intent.getExtras().getInt("nPassageiros");
passageirosArray = new Passageiro[nPassageiros];
passageiroFragment = new DadosPassageirosFragment[nPassageiros];
Titles = new CharSequence[nPassageiros];
int i;
for (i=0; i<nPassageiros; i++){
Titles[i] = nTitlesPassageiros + "° Passageiro" + " (ADT)";
nTitlesPassageiros +=1;
}
if (nCriancas > 0){
for (i=nCriancas; i>0; i--){
Titles[(Titles.length-i)-nBebes] = Titles[(Titles.length-i)-nBebes].subSequence(0,13) + " (CHD)";
}
}
if (nBebes >0){
for (i=nBebes; i>0; i--){
Titles[Titles.length-i] = Titles[Titles.length-i].subSequence(0,13) + " (INF)";
}
}
// Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
pagerAdapter = new ViewPagerPassageirosAdapter(getSupportFragmentManager(),Titles,nPassageiros, this);
// Assigning ViewPager View and setting the adapter
pager = (NonSwipeableViewPager) findViewById(R.id.pager);
pager.setAdapter(pagerAdapter);
for (i=0; i<nPassageiros; i++){
passageiroFragment[i] = (DadosPassageirosFragment)pagerAdapter.getItem(i);
getTabName(i);
}
}
public void getTabName(int pos){
CharSequence title = pagerAdapter.getPageTitle(pos);
if (title.subSequence(title.length()-4, title.length()-1).equals("INF")){
passageiroFragment[pos].etDataNasc.setVisibility(View.VISIBLE);
}
else {
passageiroFragment[pos].etDataNasc.setVisibility(View.INVISIBLE);
}
}
}
这是我的适配器:
public class ViewPagerPassageirosAdapter extends FragmentStatePagerAdapter {
Context mContext;
CharSequence Titles[]; // This will Store the Titles of the Tabs which are Going to be passed when ViewPagerAdapter is created
int NumbOfTabs; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created
// Build a Constructor and assign the passed Values to appropriate values in the class
public ViewPagerPassageirosAdapter(FragmentManager fm,CharSequence mTitles[], int mNumbOfTabsumb, Context c) {
super(fm);
this.Titles = mTitles;
this.NumbOfTabs = mNumbOfTabsumb;
this.mContext = c;
}
//This method return the fragment for the every position in the View Pager
@Override
public Fragment getItem(int position) {
DadosPassageirosFragment tab = DadosPassageirosFragment.newInstance(this.mContext);
return tab;
}
// This method return the titles for the Tabs in the Tab Strip
@Override
public CharSequence getPageTitle(int position) {
return Titles[position];
}
// This method return the Number of tabs for the tabs Strip
@Override
public int getCount() {
return NumbOfTabs;
}
}
这里是使用实例方法的片段本身:
public class DadosPassageirosFragment extends Fragment {
static EditText etNome, etSobrenome, etEmail;
TextView aviso;
public EditText etDataNasc;
DadosPassageirosActivity dadosPassageiros;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_form_passageiro, container, false);
dadosPassageiros = (DadosPassageirosActivity)getActivity();
etNome = (EditText)v.findViewById(R.id.formPassageirosNome);
//etSobrenome = (EditText)v.findViewById(R.id.formPassageirosSobrenome);
//etEmail = (EditText)v.findViewById(R.id.formPassageirosEmail);
etDataNasc = (EditText)v.findViewById(R.id.formPassageirosDataNasc);
return v;
}
public static DadosPassageirosFragment newInstance(Context c){
DadosPassageirosFragment f = new DadosPassageirosFragment();
LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.fragment_form_passageiro, null, false);
f.etDataNasc = (EditText)v.findViewById(R.id.formPassageirosDataNasc);
return f;
}
}
这是一个很长的解决方案,如果您有什么不明白的地方,请问我..
在 DadosPassageirosFragment
添加一个布尔值来决定对象是否应该可见..
boolean isVisible;
在主 Activity 上创建所有片段并根据您的需要更新 isVisible var..
将所有片段发送到适配器,不要在片段内创建它们,只需return根据所选位置正确。
public ViewPagerPassageirosAdapter(`DadosPassageirosFragment[] fragments`...
当系统构建每个 Fragment 时,它会检查 isVisible var 和 shows/hide 这个 EditText
使用 onStart()
函数来 VISIBLE/INVISIBLE EditText