GVKun编程网logo

android – 片段翻转和丢失图像(android翻转动画)

8

在本文中,我们将带你了解android–片段翻转和丢失图像在这篇文章中,我们将为您详细介绍android–片段翻转和丢失图像的方方面面,并解答android翻转动画常见的疑惑,同时我们还将给您一些技巧

在本文中,我们将带你了解android – 片段翻转和丢失图像在这篇文章中,我们将为您详细介绍android – 片段翻转和丢失图像的方方面面,并解答android翻转动画常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Android Studio – 使用依赖于另一个Android库的Android库构建Android项目、Android Studio:在片段类中生成饼图(MPAndroidChart)返回黑屏、android – ViewPager片段 – 片段未显示、android – 一些片段在旋转时丢失

本文目录一览:

android – 片段翻转和丢失图像(android翻转动画)

android – 片段翻转和丢失图像(android翻转动画)

我已经完全重写了这个问题,以便缩小范围.

我有两个片段像卡片一样翻转(左,右).当前片段消失翻转时,它会显示背面.再次单击该按钮后,它会再次翻转到前面,但前面片段上的ImageView消失了.

我尝试过保存所选图像数据的不同方法.

>保存碎片onSaveInstanceState

这给了我一个空指针,所以我想我创建后需要一些更恒定的东西.

>所以现在我将图像保存到SDCard一次

这个我认为可行,只需检查路径并抓住它,如果它翻转到前面或重新创建活动.

这是一些代码

的onCreate():

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.new_postcard_activity);
        //UI call
        frontimageView = (ImageView) findViewById(R.id.imageView);
        Log.d(tag,"onCreate() Instance:" + savedInstanceState);
        //fragment start
          if (savedInstanceState == null) {
              Log.d(tag,"Instance Null");
                getFragmentManager()
                        .beginTransaction()
                        .add(R.id.postcardFrame,new CardFrontFragment())
                        .commit();
                if(!mShowingBack){
                    Log.d(tag,"Not showing back");
                    if(newPath != null && newPath != ""){
                        Log.d(tag,"entered new path,not empty");
                        Drawable drawable = Drawable.createFromPath(newPath);
                        Log.d(tag,"Should be setting saved image.");
                        frontimageView.setimageDrawable(drawable);
                    }
                  }  
            } 
          else 
          {
                mShowingBack = (getFragmentManager().getBackStackEntryCount() > 0);
                Log.d(tag,"Instance is not Null");
          }

翻转按钮单击“侦听器”

//flip card
final Button cardBackButton = (Button) findViewById(R.id.cardBackButton);
cardBackButton.setonClickListener(new Button.OnClickListener(){

    @Override
    public void onClick(View v) {
        flipCard();
});

flipCard方法:

private void flipCard()
    {
        Log.d(tag2,"Log after flipCard:" + mShowingBack);
        if(mShowingBack)
        {
            //Flip to front
            flipFront();
             return;
        }
        // Flip to back
        flipBack();
    }

我从他们的Photogallery中设置了Image onActivityResult

protected void onActivityResult(int requestCode,int resultCode,Intent intent) {
        super.onActivityResult(requestCode,resultCode,intent);

        if (resultCode == RESULT_OK) {
            Uri photoUri = intent.getData();

            if (photoUri != null) {
                try {
                    ImageView setimage = (ImageView)findViewById(R.id.imageView);
                    frontimage = MediaStore.Images.Media.getBitmap(this
                        .getContentResolver(),photoUri);
                    imageset = true;
                    //save image to SD
                    if(imageset == true){
                        Log.d(tag,"Inside Image Set if Statement");
                    String path = getExternalCacheDir() + "Postcards.png";
                    if(path != null && path != ""){
                    Log.d(tag,"Path is:" + path);
                    File file = new File(path);
                    newPath = file.getAbsolutePath();
                    Log.d(tag,"New Path:" + newPath);
                    if(file.exists()){
                        Log.d(tag,"File Exists");
                        Drawable d = Drawable.createFromPath(newPath);
                        setimage.setimageDrawable(d);

                    }else{
                        try{
                            Log.d(tag,"File didnt exist");
                            FileOutputStream out = new FileOutputStream(file);
                            frontimage.compress(Bitmap.CompressFormat.PNG,90,out);
                            if(file.exists()){
                                Log.d(tag,"file exists Now");
                            newPath = file.getAbsolutePath();
                            Drawable b = Drawable.createFromPath(newPath);
                            setimage.setimageDrawable(b);
                            }
                        }catch(Exception e){
                            e.printstacktrace();
                        }
                    }
                }
                    }
                } catch (Exception e) {
                    e.printstacktrace();
                }

这是我访问图像并尝试在Restart()上将其设置为我的ImageView的方式

if(imageset == true){
            if(newPath != null && newPath != ""){
                ImageView view = (ImageView) findViewById(R.id.imageView);
                Drawable drawable = Drawable.createFromPath(newPath);
                view.setimageDrawable(drawable);
            }
        }

这似乎是获取图像和设置图像的最佳途径,但它不会工作.
什么是最佳实践,如何让它以我需要的方式执行?

非常感谢任何帮助!

解决方法

savedInstanceState用于不同的目的.

onSaveInstanceState (Bundle):
This method is called before an activity may be killed so that when it
comes back some time in the future it can restore its state

而且,在您的特定情况下,甚至可能不需要它.单击按钮,您将更改片段,而不是重新启动应用程序.

从我所看到的,你让用户创建一张明信片:一面是图片(比如A面),另一面是消息(比如说B面).当应用程序启动时,A侧即可查看.在某种程度上,您让用户从图库中选择一个图像.我将假设onActivityResult(int,int,Intent)按预期工作,并将图像设置为ImageView – R.id.imageView.单击按钮时,视图将更改为B侧.再次单击该按钮时,视图将更改为A面,但用户选择的图像不存在.

你可以在onActivityResult(int,Intent)中做的一件事是:在SharedPreferences中保存图像的路径.

SharedPreferences preferences;
final String PREFS = "your.application.name.prefs";

// Keyword to find the path
final String IMAGE_SELECTED_BY_USER = "image_selected_by_user";

// Use a default image when the user starts the app for the first time
// or if the retrieved path points to a deleted image etc.
final String PATH_TO_A_DEFAULT_IMAGE = "path_to_a_default_image"    

@Override
protected void onCreate(Bundle savedInstanceState) {

    ....
    ....
    preferences = getActivity().getSharedPreferences(PREFS,0);
    imagePath = preferences.getString(IMAGE_SELECTED_BY_USER,PATH_TO_A_DEFAULT_IMAGE);

    frontimageView = (ImageView) findViewById(R.id.imageView);

    Drawable drawable = null;

    if (new File(imagePath).exists()) {
        drawable = Drawable.createFromPath(imagePath);
    } else {
        drawable = Drawable.createFromPath(PATH_TO_A_DEFAULT_IMAGE);
    }

    frontimageView.setimageDrawable(drawable);

    getFragmentManager()
        .beginTransaction()
        .add(R.id.postcardFrame,new CardFrontFragment())
        .commit();

    ....
    ....
}

在onActivityResult(int,Intent)中,保存图像路径:

if(file.exists()){
    Log.d(tag,"File Exists");
    Drawable d = Drawable.createFromPath(newPath);
    setimage.setimageDrawable(d);

    Editor editor = preferences.edit();
    editor.putString(IMAGE_SELECTED_BY_USER,newPath);
    editor.commit();
} else{
    try{
        Log.d(tag,"File didnt exist");
        FileOutputStream out = new FileOutputStream(file);
        frontimage.compress(Bitmap.CompressFormat.PNG,out);
        if (file.exists()) { 
            Log.d(tag,"file exists Now");
            newPath = file.getAbsolutePath();
            Drawable b = Drawable.createFromPath(newPath);
            setimage.setimageDrawable(b);

            Editor editor = preferences.edit();
            editor.putString(IMAGE_SELECTED_BY_USER,newPath);
            editor.commit();
        }
    } catch (Exception e) {
        e.printstacktrace();
    }
}

这样,当用户启动应用程序时,他/她将看到默认图像或先前选择的图像.

其中savedInstanceState很有用:假设你给用户一个在B面写短信的选项.现在,如果在写消息时,用户将设备从Landscape旋转到Portrait(反之亦然),那么消息他就是/她写的将会消失,因为活动将被销毁并重新创建.要保存消息,可以使用onSaveInstanceState(Bundle):

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putString("Text_To_Save",someEditText.getText().toString());
}

轮换时,将调用活动的onCreate(Bundle)’.传递的包与fromSaveInstanceState(Bundle)`相同.要检索文本:

String savedString = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        if (savedInstanceState.contains("Text_To_Save")) {
            savedString = savedInstanceState.getString("Text_To_Save");
        }
    }

    someEditText.setText(savedString);
}

Android Studio – 使用依赖于另一个Android库的Android库构建Android项目

Android Studio – 使用依赖于另一个Android库的Android库构建Android项目

我需要使用Gradle构建一个依赖于Android库项目A的Android项目,该项目取决于另一个Android库项目B.

到目前为止,我有以下内容:

Android项目:

的build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android'

dependencies {
    compile project(':LibA')
}

android {
    compileSdkVersion 7
    buildToolsversion "17.0.0"
}

manifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cyborg.template"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="7" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name="com.cyborg.template.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Android库A:

的build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android-library'

dependencies {
    compile project(':LibB')
}


android {
    compileSdkVersion 7
    buildToolsversion "17.0.0"
} 

manifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.lib.project.a"
          android:versionCode="1"
          android:versionName="1.0">

    <uses-sdk
            android:minSdkVersion="7"
            android:targetSdkVersion="7"/>

</manifest>

Android库B:

的build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android-library'

android {
    compileSdkVersion 7
    buildToolsversion "17.0.0"
} 

manifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.lib.project.b"
          android:versionCode="1"
          android:versionName="1.0">

    <uses-sdk
            android:minSdkVersion="7"
            android:targetSdkVersion="7"/>

</manifest>

在尝试构建Android项目时,Android studio报告了以下错误:

Gradle: Execution Failed for task ':LibA:processDebugManifest'.
  > Manifest merging Failed. See console for more info.

那个控制台在哪里我想搜索有关错误的更多信息?

我发现了一些关于这个错误的问题,但它似乎与我的情况不一样.

启示?

谢谢,
亚当.

解决方法:

该库的清单文件当前必须具有< application />节点,即使它是空的.

这是我们将在某些时候删除的限制,但现在,只需添加它.

Android Studio:在片段类中生成饼图(MPAndroidChart)返回黑屏

Android Studio:在片段类中生成饼图(MPAndroidChart)返回黑屏

如何解决Android Studio:在片段类中生成饼图(MPAndroidChart)返回黑屏?

我正在尝试生成由 MPAndroidChart 提供的 PieChart。 网上大部分例子都是在MainActivity类中实现图表的,但是我想在片段类中使用。

这是代码

public class AssessmentFragment extends Fragment {
private TextView assessment_result;
private PieChart pieChart;
private PieData pieData;
private PieDataSet pieDataSet;
private ArrayList pieEntries;
private ArrayList PieEntryLabels;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_assessment,container,false);


    return view;
}

@Override
public void onViewCreated(View view,@Nullable Bundle savedInstanceState) {
    assessment_result = getView().findViewById(R.id.assessment_result);
    assessment_result.setText("Your favorite restaurant status: " + Utils.Status(User.favrest(),//Ignore these two lines when you try this code.
    pieChart = getView().findViewById(R.id.piechart);
    getEntries();
    pieDataSet = new PieDataSet(pieEntries,"");
    pieData = new PieData(pieDataSet);
    pieChart.setData(pieData);
    pieDataSet.setColors(ColorTemplate.JOYFUL_COLORS);
    pieDataSet.setSliceSpace(2f);
    pieDataSet.setValueTextColor(Color.WHITE);
    pieDataSet.setValueTextSize(10f);
    pieDataSet.setSliceSpace(5f);
}
private void getEntries() {
    pieEntries = new ArrayList<>();
    pieEntries.add(new PieEntry(2f,0));
    pieEntries.add(new PieEntry(4f,1));
    pieEntries.add(new PieEntry(6f,2));
    pieEntries.add(new PieEntry(8f,3));
    pieEntries.add(new PieEntry(7f,4));
    pieEntries.add(new PieEntry(3f,5));
}
}

这就是我在 fragment_assessment.xml 中调用饼图的方式

    <view
        android:id="@+id/piechart"android:layout_width="32dp"
        android:layout_height="203dp"
        android:layout_weight="1" />

当我运行它时,它显示黑屏并返回主页面,如果我再次尝试,则会返回错误消息。 我也尝试在 onCreateView 中放入关于饼图的代码,结果也是一样的情况(黑屏)。 生成 PieChart 的代码没有错,在 MainActivity 中有效。

我应该在哪里修改才能使这个工作? 或者你们能展示一个在片段中生成饼图的例子吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

android – ViewPager片段 – 片段未显示

android – ViewPager片段 – 片段未显示

我试图使用viewpager来显示几个片段.目前我只有一个片段,但它似乎永远不会被实例化.我尝试使用pager.setCurrentItem(0),但永远不会调用适配器中的getItem方法.有谁知道为什么我的片段没有加载到下面的代码?

主要活动

public class MainActivity extends SherlockFragmentActivity {

MyPagerAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_main );

    // Create the FragmentPager Adapter and assign it to the viewpager
    adapter = new MyPagerAdapter( getSupportFragmentManager(),this );
    ViewPager pager = ( ViewPager ) findViewById( R.id.pager );
    pager.setAdapter( adapter );
    pager.setCurrentItem( 0 );

    // Setup the tab page indicator
    TabPageIndicator indicator = ( TabPageIndicator ) findViewById( R.id.indicator );
    indicator.setViewPager( pager );
}

class MyPagerAdapter extends FragmentStatePagerAdapter {
    private SparseArray

MainActivity布局

ScheduleListFragment

public class ScheduleListFragment extends SherlockListFragment implements ViewPagerPage {

private ScheduleAdapter adapter;
private final String TITLE = "Schedule";

public static ScheduleListFragment newInstance() {
    ScheduleListFragment newFrag = new ScheduleListFragment();
    Bundle args = new Bundle();
    newFrag.setArguments( args );
    return newFrag;
}

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    return inflater.inflate( R.layout.fragment_schedule_list,null );
}

@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
    inflater.inflate( R.menu.fragment_schedule_list,menu );
}

// Container Activity must implement this interface
public interface OnAddItemClickedListener {
    public void onAddItemClicked();
}

@Override
public boolean onoptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch ( item.getItemId() ) {
    case R.id.add_item:
        Intent myIntent = new Intent( getActivity(),AddScheduleItemActivity.class );
        startActivityForResult( myIntent,1 );

        return true;
    default:
        return super.onoptionsItemSelected( item );
    }
}

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated( savedInstanceState );
    setHasOptionsMenu( true );

    adapter = new ScheduleAdapter( getActivity() );

    setlistadapter( adapter );
}

private class SampleItem {
    public String tag;
    public int iconRes;

    public SampleItem(String tag,int iconRes) {
        this.tag = tag;
        this.iconRes = iconRes;
    }
}

public class ScheduleAdapter extends ArrayAdaptertimageResource( getItem( position ).iconRes );
        TextView title = ( TextView ) convertView.findViewById( R.id.row_title );
        title.setText( getItem( position ).tag );

        return convertView;
    }

}

@Override
public String getTitle() {
    return TITLE;
}

@Override
public void onActivityResult(int requestCode,int resultCode,Intent data) {
    if ( resultCode == android.app.Activity.RESULT_OK ) {
        String name = ( String ) data.getExtras().get( "TEXT" );
        Toast.makeText( getActivity(),name,Toast.LENGTH_LONG ).show();
    }
}

片段布局

谢谢,
弥敦道

现有解决方案

更改了适配器构造函数以初始化第一个片段并将其添加到内部映射.有没有人看到这样做有什么问题,或者改进上面发布的任何代码?谢谢!

public MyPagerAdapter(FragmentManager fm,Activity context) {
        super( fm );
        fragmentPageMap = new SparseArray
最佳答案
getCount()在MyPagerAdapter中返回0,因此不会创建片段,如果要实例化N片段,它应返回N.

fragmentPageMap是在构造函数中创建的,当调用getCount()并在getItem(index)之前调用getCount()时为空,这就是getCount()返回0的原因

在这种情况下,您不需要切换,因为您每次都要实例化相同的Fragment.但是,如果您在实例化不同的碎片,那么您将需要它.

@Override
public Fragment getItem(int index) {
  switch (index) {
    case 0:
      return new Fragment1();
    case 1:
      return new Fragment2();
  }
  return null;
}

android – 一些片段在旋转时丢失

android – 一些片段在旋转时丢失

在我的FragmentActivity中,我使用了几个片段.当配置改变时(旋转时),系统会破坏并重新创建每个片段.
我尝试使用这个重新创建的片段

mFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_frame);

并把它放到新的布局

getSupportFragmentManager().beginTransaction()
    .replace(R.id.fragment_frame,mFragment )       
    .commit();

但遇到奇怪的行为:丢失了几个碎片.它们不会更多地显示在屏幕上.在他们的位置是空的.
虽然日志显示片段重新创建正常,但进一步显示片段再次被破坏,再次创建和销毁.

我为展示问题建立了更清晰,没有外壳的测试项目.
并且有明显的结果(插入图片的声誉不够)
Activity started picture
Activity rotated picture

A,B,C,D是片段
正如您在配置更改后看到的那样,一些片段丢失了(B,D)

告诉我我做错了什么

这是帮助的代码(编辑:将代码推送到gitHub以便更容易尝试)

https:// github.com/nailgilaziev/TestFragmentsRetain

p / s抱歉链接

旋转设备后,这里记录猫

MainActivity: onPause Activity
MainActivity: onStop Activity
MainActivity: onDestroy Activity
A: onDestroyview
A: onDestroy
B: onDestroyview
B: onDestroy
C: onDestroyview
C: onDestroy
D: onDestroyview
D: onDestroy
MainActivity: onCreate Activity
A: onCreate
B: onCreate
C: onCreate
D: onCreate
MainActivity: replaced
MainActivity: onStart Activity
A: onCreateView
B: onCreateView
C: onCreateView
D: onCreateView

<--before this point all fine and then strange behavior began
for the lost fragments(B,D) are performed unnecessary calls-->

B: onDestroyview
B: onDestroy
D: onDestroyview
D: onDestroy
D: onCreate
D: onCreateView
MainActivity: onResume Activity

解决方法

通过分解您的问题,使得有两个片段而不是四个,您将看到onCreateView在方向更改时在同一片段上多次被调用.这表明同一片段被添加/创建不止一次.

基本上,当方向更改时,您的Fragments将自动重新附加,因此每次调用onCreate(Bundle)时都不需要执行FragmentTransaction.

你应该在onCreate(Bundle)上做什么呢……

> Null检查传入onCreate(Bundle)的savedInstanceState Bundle. – 如果发生方向更改,则再次调用onCreate(Bundle)并且savedInstanceState Bundle将变为非null. FragmentActivity在重新创建之前将数据保存在onSaveInstanceState(Bundle)中.
>如果savedInstanceState为null,则创建片段并通过FragmentTransaction附加它们.否则,什么也不做.

总之,您修改后的代码应该类似于以下内容……

FragmentManager fm = getSupportFragmentManager();
if(savedInstanceState == null) {
    fm.beginTransaction()
            .replace(R.id.a,new A())
            .replace(R.id.b,new B())
            .replace(R.id.c,new C())
            .replace(R.id.d,new D())
            .commit();
}
else {
    a = fm.findFragmentById(R.id.a);
    b = fm.findFragmentById(R.id.b);
    c = fm.findFragmentById(R.id.c);
    d = fm.findFragmentById(R.id.d);
}

另外,请注意,Fragment的onCreate(Bundle)方法中的savedInstanceState Bundle将始终为null,除非您在onSaveInstanceState(Bundle)中保存了一些内容,因此不要假设saveInstanceState在片段中也是非null的当它被重新创建时,就像FragmentActivity的情况一样.

关于android – 片段翻转和丢失图像android翻转动画的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android Studio – 使用依赖于另一个Android库的Android库构建Android项目、Android Studio:在片段类中生成饼图(MPAndroidChart)返回黑屏、android – ViewPager片段 – 片段未显示、android – 一些片段在旋转时丢失的相关信息,请在本站寻找。

本文标签: