gpt4 book ai didi

android - 实现 Fragment 和 ViewPager 后无法编辑某些 View

转载 作者:行者123 更新时间:2023-11-30 03:50:27 25 4
gpt4 key购买 nike

编辑:

通过更多的探索,我几乎可以肯定问题是当我在我的 FragmentActivity 中膨胀布局时的 onCreate() 方法,在 ViewPager 中有不同的 View 膨胀。因此,当我尝试使用 xml1.findViewById() 访问它们时它看着不同的 View 。如何访问 ViewPager 中使用的 View ?查看我的 FragmentPagerAdapter看起来 fragment 每次超过 1 次滑动时都会被创建为新对象。我希望所有 4 个 View 都初始化一次。然后每次调用updateUI四个 View 同时改变。所以我可以在新更新的所有四个 View 之间滑动。

我尝试使用 pagerAdapter.getItem(index).getView().findViewById( ) , 但它返回 NullPointerException .得到异常后,我尝试覆盖 getView()我的 Fragment 中的方法类。我在方法中输入的只是return view; ,其中 view 是 onCreateView 中返回的 View 的保存实例方法。这导致我的 ViewPager 显示 4 个空白屏幕可以在它们之间滑动。

我添加了我的 FragmentPagerAdapter实现到问题的底部。

结束编辑

我试图实现 ViewPager 通过使用 Fragments .我得到了非常奇怪的结果。

private TextView view1a, view1b;
private TextView view2a, view2b;
private TextView view3a, view3b;
private TextView view4a, view4b;
private Spinner spinner1, spinner2, spinner3, spinner4;
private Checkbox check1, check2, check3, check4;

private ViewPager mViewPager;
private View xml1, xml2, xml3, xml4;

public void onCreate( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
setContentView( R.layout.main_page );

mViewPager = (ViewPager) findViewById( R.id.pager );
FragmentManager fm = getSupportFragmentManager();
MoreParmsFragmentPagerAdapter pagerAdapter = new MoreParmsFragmentPagerAdapter(fm);

xml1 = LayoutInflater.from( getBaseContext()).inflate( R.layout.xml1, null );
xml2 = LayoutInflater.from( getBaseContext()).inflate( R.layout.xml2, null );
xml3 = LayoutInflater.from( getBaseContext()).inflate( R.layout.xml3, null );
xml4 = LayoutInflater.from( getBaseContext()).inflate( R.layout.xml4, null );
populateSpinners();
updateUI();
}


public void populateSpinners() {
array1Adapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, res.getStringArray( R.array.array1 ) );
array1Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1 = (Spinner) xml1.findViewById(R.id.spinner1);
spinner1.setAdapter(array1Adapter);

array2Adapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, res.getStringArray( R.array.array2 ) );
array2Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2 = (Spinner) xml2.findViewById(R.id.spinner2);
spinner2.setAdapter(array2Adapter);

array3Adapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, res.getStringArray( R.array.array3 ) );
array3Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner3 = (Spinner) xml3.findViewById(R.id.spinner3);
spinner3.setAdapter(array3Adapter);

array4Adapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, res.getStringArray( R.array.array4 ) );
array4Adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner4 = (Spinner) xml4.findViewById(R.id.spinner4);
spinner4.setAdapter(array4Adapter);
}

public void updateUI() {
view1a = (TextView) xml1.findViewById( R.id.view_one_a );
view1b = (TextView) xml1.findViewById( R.id.view_one_b );
view2a = (TextView) xml2.findViewById( R.id.view_two_a );
view2b = (TextView) xml2.findViewById( R.id.view_two_b );
view3a = (TextView) xml3.findViewById( R.id.view_three_a );
view3b = (TextView) xml3.findViewById( R.id.view_three_b );
view4a = (TextView) xml4.findViewById( R.id.view_four_a );
view4b = (TextView) xml4.findViewById( R.id.view_four_b );
// There is work done here to determine what to set
// the different TextViews' text to.
//
// `view**.setText()` is called for all views above with their respective values.

spinner1 = (Spinner) xml1.findViewById( R.id.spinner1 );
spinner2 = (Spinner) xml2.findViewById( R.id.spinner2 );
spinner3 = (Spinner) xml3.findViewById( R.id.spinner3 );
spinner4 = (Spinner) xml4.findViewById( R.id.spinner4 );
// There is work done here to determine what index the Spinners
// should have selected.
//
// `Spinner.setSelection( index ) is called on all spinners.

check1 = (CheckBox) xml1.findViewById( R.id.check1 );
check2 = (CheckBox) xml2.findViewById( R.id.check2 );
check3 = (CheckBox) xml3.findViewById( R.id.check3 );
check4 = (CheckBox) xml4.findViewById( R.id.check4 );
// There is work done here to determine whether or not
// to check the CheckBoxes.
//
// CheckBox.setChecked() is called for all checkboxes.
}
}

这是我的 Fragment 的示例类:
public class xmlOneFragment extends Fragment {
int mCurrentPage;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

/** Getting the arguments to the Bundle object */
Bundle data = getArguments();

/** Getting integer data of the key current_page from the bundle */
mCurrentPage = data.getInt("current_page", 0);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.xml1, container,false);
return v;
}
}

第一问题是 Spinners永远不会被其对应的数组填充。有 LogCat在我的 populateSpinners() 中调用电话显示我期望的方法,但是 Spinners自己没有人口。

第二 updateUI() 中出现问题方法。所有 findViewById() 下面的评论调用是我进行某些计算以确定要放入 TextViews 中的文本的地方。 ,设置什么索引 Spinners到,以及是否检查 CheckBoxes .我有 LogCat调用显示找到的值,它们都是预期的。
.setText(), .setSelection(), and .setChecked()方法被调用,没有显示错误,但根本没有设置任何项目。一切都保持空白。

第三问题是最让我困惑的。 TextViews现在都有唯一的 ID。当我第一次尝试实现这个 ViewPager , 我有 updateUI()方法处理没有 xml*. 的 TextViews findViewById() 的前缀来电。
view1a = (TextView) findViewById( R.id.view_one_a );
view1b = (TextView) findViewById( R.id.view_one_b );
view2a = (TextView) findViewById( R.id.view_two_a );
view2b = (TextView) findViewById( R.id.view_two_b );
view3a = (TextView) findViewById( R.id.view_three_a );
view3b = (TextView) findViewById( R.id.view_three_b );
view4a = (TextView) findViewById( R.id.view_four_a );
view4b = (TextView) findViewById( R.id.view_four_b );
// There is work done here to determine what to set
// the different TextViews' text to.
view**.setText( whatever );

此方法导致 NullPointerException , 但仅在调用 .setText() 时与 TextViews在第三页和第四页。前两页没有抛出任何异常。所以我把第三页和第四页注释掉了。程序运行,前两页在正确的 TextView 中显示了正确的值。然后我尝试添加 xml*.findViewById()方法,现在没有抛出异常,但根本没有更新 View 。

最后注: ViewPager功能正常,我可以很好地在正确的布局之间滑动。当我尝试使用我想要的值更新 View 时会出现问题。我假设这个问题与我如何膨胀布局有关,或者我如何做太多次。第三个问题真的让我很困惑。我找不到第一页/第二页和第三/第四页之间的任何区别,但它们显然表现不同。此外,显示的第一个代码块表示为 Activity ,第二个代码块我切换到 FragmentActivity .

编辑以添加 FragmentPagerAdapter
public class MoreParmsFragmentPagerAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 4;

public MoreParmsFragmentPagerAdapter( FragmentManager fm ) {
super(fm);
}

public Fragment getItem( int arg0 ) {
if( arg0 == 0 ) {
xmlOneFragment xml1Frag = new xmlOneFragment();
Bundle data = new Bundle();
data.putInt( "current_page", arg0 );
xmlOneFrag.setArguments( data );
return xmlOneFrag;
} else if( arg0 == 1 ) {
xmlTwoFragment xml2Frag = new xmlTwoFragment();
Bundle data = new Bundle();
data.putInt( "current_page", arg0 );
xmlTwoFrag.setArguments( data );
return xmlTwoFrag;
} else if( arg0 == 2 ) {
xmlThreeFragment xml3Frag = new xmlThreeFragment();
Bundle data = new Bundle();
data.putInt( "current_page", arg0 );
xmlThreeFrag.setArguments( data );
return xmlThreeFrag;
} else {
xmlFourFragment xml4Frag = new xmlFourFragment();
Bundle data = new Bundle();
data.putInt( "current_page", arg0 );
xmlFourFrag.setArguments( data );
return xmlFourFrag;
}
}

@Override
public CharSequence getPageTitle(int position) {
if( position == 0 ) {
return "xml1";
} else if( position == 1 ){
return "xml2";
} else if( position == 2 ) {
return "xml3";
} else {
return "xml4";
}
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return PAGE_COUNT;
}
}

编辑 2:
private ViewPager mViewPager;
private MoreParmsFragmentPagerAdapter pagerAdapter;
private FragmentManager fm;
private AntiPumpFragment apFrag;
private RelaxedCloseFragment relFrag;
private MiscParmsFragment miscFrag;
private DNP3Fragment dnpFrag;

public void onCreate( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
mViewPager = (ViewPager) findViewById( R.id.pager );
fm = getSupportFragmentManager();
pagerAdapter = new MoreParmsFragmentPagerAdapter(fm);
mViewPager.setAdapter( pagerAdapter );

apFrag = (AntiPumpFragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":0" );
relFrag = (RelaxedCloseFragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":1" );
miscFrag = (MiscParmsFragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":2" );
dnpFrag = (DNP3Fragment) fm.findFragmentByTag( "android:switcher:" + R.id.pager + ":3" );

在我的代码中,所有这些 fragment 都返回 null。 ViewPager在我的屏幕上正确显示,我可以干净地在所有四个 View 之间滑动。但是,我所有的 if( apFrag != null )语句总是被跳过。

最佳答案

The FIRST problem is that the Spinners are never filled with their corresponding Arrays. There are LogCat calls throughout my populateSpinners() method that show me what I expect, but the Spinners themselves are not populated.



正如您后来发现的那样,您看不到 Spinners初始化,因为,而不是连接到来自 Fragments 的 View 的 ViewPager ,您只需使用 LayoutInflater 充气新 View 来自 Fragments 中使用的布局文件.初始化这个新 View 的 subview 不会显示任何视觉结果,因为它在 Activity 的 UI 中不存在/显示。 ,它正在“ float ”周围等待您将其附加到 ViewGroupActivity所以它可以显示它有什么 View 。

The SECOND problem arises in the updateUI() method. The comments below all of the findViewById() calls are where I do certain calculations to determine what text to put in the TextViews, what index to set the Spinners to, and whether or not to check the CheckBoxes. I have LogCat calls showing the values found, and they are all what is expected. When the .setText(), .setSelection(), and .setChecked() methods are called, no errors are shown, but none of the items are set at all. Everything stays blank.



这与一个相同,您不初始化显示的 View ,您正在更新未附加的 View等级制度。

The THIRD problem is what is confusing me the most. The TextViews now all have unique IDs. When I first tried implementing this ViewPager, I had the updateUI() method deal with TextViews without the xml*. prefix to the findViewById() calls.[...]This method resulted in a NullPointerException, but only when calling .setText() with the TextViews on the THIRD and FOURTH page. The first two pages did not throw any exceptions



也许这会解决问题: ViewPager ,除了允许左右滑动之外,还设计了(通过适配器)以允许使用尽可能少的 View (例如 ListView,它只为可见行增加行)。为此,它只构建一定数量的页面。默认情况下,此页数为 3(可见的一页 + 每侧一页,因此滑动将平滑)和 ViewPager将在您向前或向后滑动时开始加载其他页面。当您启动 ViewPager它将加载第一页(可见页)+ 下一页(在右侧),以便用户可以立即滑动。其他两个页面没有加载以提高效率,尝试从它们访问小部件将抛出 NullPointerException因为他们找不到。最后,如果用户可能根本看不到这些页面,那么您最终不应该做不必要的工作。现在,您可以修改 ViewPager 的页数了。创建并保存在内存中(使用 setOffscreenPageLimit() 并提供一个数字),但你应该尽量避免它以提高效率,因为这会一次加载内存中的所有小部件(在你的情况下,这可能不会那么糟糕,但是我不知道你想做什么)。

I tried using pagerAdapter.getItem(index).getView().findViewById( ), but it returns a NullPointerException. After I got the exception, I tried overriding the getView() method in my Fragment classes. All I put in the method was return view;, where view was a saved instance of the View returned in the onCreateView method. This resulted in my ViewPager showing 4 blank screens to swipe between.



您不能使用 geItem()适配器的方法,因为这不会返回 Fragment ViewPager 当前使用的实例,它将返回 Fragment那只是实例化。因为它只是实例化而不附加到 Activity , 它的 getView()方法不会返回 View 。

How can I access the views that are being used in the ViewPager?



这取决于您何时想要访问它们。当您在 ViewPager 上设置适配器时数据是否可用然后只需将初始化移动到 FragmentsonCreateViewonActivityCreated方法。

如果您想稍后访问 Fragment来自 ViewPager你可以使用一个小技巧,知道 ViewPager添加(暂时) FragmentsFragmentManager带有 android:switcher:theIdOfTheViewPager:thePositionInTheViewPager 形式的特殊标签.例如,要访问第一个 FragmentViewPager :
xmlOneFragment first = (xmlOneFragment)getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":0");
// if the fragment is found and its view is available do stuff
if (first != null && first.getView() != null) {
// do stuff
}

不是最佳解决方案,但它会为您工作,直到您对 ViewPager 有更多的了解为止。 .

关于android - 实现 Fragment 和 ViewPager 后无法编辑某些 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14244172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com